觀察者模式
<設計模式其實很簡單>筆記
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生改變時,會通知所有觀察者對象,使它們能夠自動更新自己。
//抽象的觀察者類
public abstract class Observer{
public abstract void Update();
}
//具體的觀察者
public class ConcreteObserver extends Observer{
private String observerName;
private String State;
private ConcreteSubject concreteSubject;
//得到具體的主題
public ConcreteSubject getConcreteSubject(){
Return concreteSubject;
}
//設定具體的主題
public void setConcreteSubject(ConcreteSubject concreteSubject){
this.concreteSubject = concreteSubject;
}
//含參構造方法
public ConcreteObserver(ConcreteSubject concreteSubject , String ovserverName){
this.concreteSubject = concreteSubject;
this.observerName = ovserverName;
}
//覆蓋更新狀態的方法
//獲取情報方法
@Override
public void Update(){
State = concreteSubject.getState();
System.out.println(observerName + "觀察到的狀態是:" + State);
}
}
//抽象的通知者類
public abstract class Subject{
private ArrayList<Observer> observers = new ArrayList<Observer>();
//進入
public void Attach(Observer observer){
observer.add(observer);
}
//離開
public void Detach(Observer observer){
observer.remove(observer);
}
//通知
public void Notify(){
for(int i = 0; i < observers.size() ; i++){
((Observer)observers.get(i)).Update();
}
}
}
//具體的通知者
public class ConcreteSubject extends Subject{
private String State;
//設定狀態
public void setState(String state){
State = state;
}
//獲取狀態
public String getState(){
return State;
}
}
//客戶端
public static void main(String[] args){
ConcreteSubject concreteSubject = new ConcreteSubject();
concreteSubject.Attach(new concreteObserver(concreteSubject,"1號觀察者"));
concreteSubject.Attach(new concreteObserver(concreteSubject,"2號觀察者"));
concreteSubject.Attach(new concreteObserver(concreteSubject,"3號觀察者"));
concreteSubject.setState("Flying");
concreteSubject.Notify();
}
//觀察者擁有通知者的對象,是多對一的關係。通知者保留所有有觀察者的對象。是一對多的關係。
③適用的地方:
當一個抽象模型有兩個方面,而其中一個方面必須依賴於另一個方面時。
當對一個對象的改變需要同時改變其他的對象但是卻不知道具體有多少個對象等待改變時
當一個對象必須通知其他對象但是卻不能與其他對象緊密耦合時。