觀察者模式

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。

這個主題對象在狀態上發生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己。

首先定義一個接口,負責對被觀察者對象的屬性更新

package com.test.observer;

/**
 * 被觀察的對象接口
 * @author yuewen
 *
 */
// 抽象觀察者角色
public interface ObserveTest {
	
	public void update(String str);
}


接下來定義一個主題角色的接口,提供對觀察者的增加,刪除,已經通知觀察者

package com.test.observer;

/**
 * 主題角色的接口,在其中聲明方法(添加、移除觀察者,通知觀察者)需要被主題觀察者繼承:
 * 
 * @author yuewen
 *
 */
public interface Observerd {

	public void addObServerd(ObserveTest o);

	public void removeObServer(ObserveTest o);

	public void notifyWatchers(String str);
}
被觀察者,實現ObserverTest接口中更新屬性的方法

package com.test.observer;

/**
 * 觀察者
 * 
 * @author yuewen
 *
 */
public class Wachter implements ObserveTest {

	@Override
	public void update(String str) {
		System.out.println(str);
	}

}
主題角色,也正是負責觀察對象已經通知被觀察者對象的負責人,需要實現Observed的接口

package com.test.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 主題角色,負責存放被觀察的對象以及更新對象的屬性
 * 
 * @author yuewen
 *
 */
public class Conceter implements Observerd {

	// 存放需要觀察的對象
	private List<ObserveTest> obServedObject = new ArrayList<ObserveTest>();

	@Override
	public void addObServerd(ObserveTest o) {
		obServedObject.add(o);
	}

	@Override
	public void removeObServer(ObserveTest o) {
		obServedObject.remove(o);
	}

	/**
	 * 該方法是核心,遍歷所有的觀察者依依更新觀察者的屬性,入參則是需要被觀察對象需要更新的屬性
	 */
	@Override
	public void notifyWatchers(String str) {
		if (!obServedObject.isEmpty() && !str.isEmpty() && str.trim() != "") {// 如果發生改變,則遍歷存放觀察者對象的信息並更新
			for (ObserveTest o : obServedObject) {
				// 更新對象
				o.update(str);
			}
		}
	}

}
測試類

package com.test.observer;

/**
 * 測試類
 * 
 * @author yuewen
 *
 */
public class MainTest {

	public static void main(String args[]) {
		// 被觀察的對象1
		ObserveTest o1 = new Wachter();
		// 被觀察對象2
		ObserveTest o2 = new Wachter();
		// 定義被觀察的對象1的方法輸出結果
		o1.update("hello");
		// 定義被觀察的對象2的方法輸出結果
		o2.update("world");
		// 主題角色,負責管理被觀察者
		Conceter con = new Conceter();
		con.addObServerd(o1);
		con.addObServerd(o2);
		// 通知觀察者,並改變原來對象的方法修改
		con.notifyWatchers("all changed");

	}
}

結果如下:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章