設計模式:觀察者模式(Observer Pattern)
阿新 • • 發佈:2018-12-10
目錄
一、模式含義
觀察者模式(Observer Pattern):定義物件之間的一種一對多依賴關係,使得每當一個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。
觀察者模式的別名:包括釋出-訂閱(Publish/Subscribe)模式、模型-檢視(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。
觀察者模式是一種物件行為型模式。
1.1Subject(目標):
目標又稱為主題,它是指被觀察的物件。在目標中定義了一個觀察者集合,一個觀察目標可以接受任意數量的觀察者來觀察,它提供一系列方法來增加和刪除觀察者物件,同時它定義了通知方法notify()。目標類可以是介面,也可以是抽象類或具體類。
1.2ConcreteSubject(具體目標):
具體目標是目標類的子類,通常它包含有經常發生改變的資料,當它的狀態發生改變時,向它的各個觀察者發出通知;同時它還實現了在目標類中定義的抽象業務邏輯方法(如果有的話)。如果無須擴充套件目標類,則具體目標類可以省略。
1.3Observer(觀察者):
觀察者將對觀察目標的改變做出反應,觀察者一般定義為介面,該介面聲明瞭更新資料的方法update(),因此又稱為抽象觀察者。
1.4ConcreteObserver(具體觀察者):
在具體觀察者中維護一個指向具體目標物件的引用,它儲存具體觀察者的有關狀態,這些狀態需要和具體目標的狀態保持一致;它實現了在抽象觀察者Observer中定義的update()方法。通常在實現時,可以呼叫具體目標類的attach()方法將自己新增到目標類的集合中或通過detach()方法將自己從目標類的集合中刪除
二、示例程式碼
2.1Subject(目標):
package com.yan.pattern.observer.define;
public interface Subject {
public void addLisener(Observer o);
public void removeLisener(Observer o);
public void notiseObservers();
}
2.2ConcreteSubject(具體目標):
package com.yan.pattern.observer.define; import java.util.ArrayList; import java.util.List; public class ConcreteSubject implements Subject{ List<Observer> lists = new ArrayList<Observer>(); public void addLisener(Observer o) { lists.add(o); } public void removeLisener(Observer o) { lists.remove(o); } private String message; public void setMessage(String message) { this.message = message; notiseObservers(); } public void notiseObservers() { for(Observer observer : lists) { observer.showMessage(message); } } }
2.3Observer(觀察者):
package com.yan.pattern.observer.define;
public abstract class Observer {
public abstract void showMessage(String message);
}
2.4ConcreteObserver(具體觀察者):
package com.yan.pattern.observer.define;
public class CatObserver extends Observer{
public void showMessage(String message) {
System.out.println("我是貓觀察者,我接收了:" + message);
}
}
package com.yan.pattern.observer.define;
public class DogObserver extends Observer{
public void showMessage(String message) {
System.out.println("我是狗觀察者,我接收了:" + message);
}
}
2.5Client(模擬客戶端使用觀察者模式):
package com.yan.pattern.observer.define;
public class Client {
public static void main(String[] args) {
ConcreteSubject observable = new ConcreteSubject();//能被觀察的
Observer observer = new CatObserver();//觀察者
observable.addLisener(observer);
Observer observer2 = new DogObserver();
observable.addLisener(observer2);
observable.setMessage("我是能被觀察的 訊息");
System.out.println("---------------------");
observable.removeLisener(observer);
observable.setMessage("我又更新了新訊息");
}
}