觀察者(Observer)模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴于它的對象都得到通知并被自動更新。
適用性:當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復用。
當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。
當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。
package?Observer;
import?java.util.Vector;
import?java.util.Enumeration;


public?abstract?class?Subject
{
????
????//聚集保存了對所有觀察者對象的引用
????private?Vector?obsVector?=new?Vector();
????//登記一個新的觀察者對象

????public?void?attach(Observer?obs)
{
????????obsVector.add(obs);
????}
????//刪除一個已經登記過的觀察者的對象

????public?void?detach(Observer?obs)
{
????????obsVector.remove(obs);
????}
????//通知所有已經登記過的觀察者對象

????public?void?notifyObservers()
{
????????Enumeration?en=observers();
????????

????????while(en.hasMoreElements())
{
????????????((Observer)en.nextElement()).update();
????????}????
????}
????//返回觀察者聚集的Enumeration對象

????public?Enumeration?observers()
{
????????return?obsVector.elements();
????}
????
}
具體Subject類
package?Observer;

public?class?ConcreteSubject?extends?Subject
{
????//改變狀態

????public?void?change()
{
????????this.notifyObservers();
????}
}Observer類
package?Observer;

public?interface?Observer
{
????//更新自己
????public?void?update();
}ConcreteObserver類
package?Observer;


public?class?ConcreteObserver?implements?Observer
{
????//調用此方法更新自己

????public?void?update()
{
????????System.out.println("I?am?nofitied");
????}
}Client類
package?Observer;


public?class?Client
{
????
????private?static?ConcreteSubject?subject;
????private?static?Observer?observer;
????

????public?static?void?main(String[]?args)
{
????????//創建主題對象
????????subject=new?ConcreteSubject();
????????//創建觀察者對象
????????observer=new?ConcreteObserver();
????????//登記觀察者對象
????????subject.attach(observer);
????????//改變狀態
????????subject.change();
????}
}
適用性:
《Java與模式》中提到了兩種結構,上圖屬于第二種,Java中內置的Observable也屬于這種。
一個簡單的例子:
Subject抽象類:










































具體Subject類




















































在JDK提供對觀察者模式的支持,利用java.util.Observable和java.util.Observer構造一個觀察者模式,在這里就不把一個示例代碼貼出來。
參考資料:《設計模式速查手冊》
???????????????????? 《Java與模式》