觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。
這個主題對象在狀態上發生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己。
首先定義一個接口,負責對被觀察者對象的屬性更新
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");
}
}
結果如下: