[toc]
基本概念
觀察者模式是對(duì)象的行為模式,又叫發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式。
觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己。
類圖
觀察者模式所涉及的角色有:
1、抽象主(Subject)角色:抽象主題角色把所有對(duì)觀察者對(duì)象的引用保存在一個(gè)聚集(比如ArrayList對(duì)象)里,每個(gè)主題都可以有任何數(shù)量的觀察者。抽象主題提供一個(gè)接口,可以增加和刪除觀察者對(duì)象,抽象主題角色又叫做抽象被觀察者(Observable)角色。
2、具體主題(ConcreteSubject)角色:將有關(guān)狀態(tài)存入具體觀察者對(duì)象;在具體主題的內(nèi)部狀態(tài)改變時(shí),給所有登記過的觀察者發(fā)出通知。具體主題角色又叫做具體被觀察者(Concrete Observable)角色。
3、抽象觀察者(Observer)角色:為所有的具體觀察者定義一個(gè)接口,在得到主題的通知時(shí)更新自己,這個(gè)接口叫做更新接口。
4、具體觀察者(ConcreteObserver)角色:存儲(chǔ)與主題的狀態(tài)自恰的狀態(tài)。具體觀察者角色實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài) 像協(xié)調(diào)。如果需要,具體觀察者角色可以保持一個(gè)指向具體主題對(duì)象的引用。

實(shí)例
Subject抽象類
package com.nemo.design.observer;
import java.util.ArrayList;
import java.util.List;
/**
* Created by nemo on 15/11/15.
*/
public abstract class Subject {
List<Observer> observers = new ArrayList<Observer>();
public void addObserver(Observer observer){
observers.add(observer);
}
public void removeObserver(Observer observer){
observers.remove(observer);
}
public void notifyObserver(){
for(Observer observer : observers){
observer.doWork();
}
}
public abstract void change(String newState);
}
ConcreteSubjec類
package com.nemo.design.observer;
import java.util.ArrayList;
import java.util.List;
/**
* Created by nemo on 15/11/15.
*/
public abstract class Subject {
List<Observer> observers = new ArrayList<Observer>();
public void addObserver(Observer observer){
observers.add(observer);
}
public void removeObserver(Observer observer){
observers.remove(observer);
}
public void notifyObserver(){
for(Observer observer : observers){
observer.doWork();
}
}
public abstract void change(String newState);
}
Observer接口
package com.nemo.design.observer;
/**
* Created by nemo on 15/11/15.
*/
public interface Observer {
public void doWork();
}
ConcreteObserver
package com.nemo.design.observer;
/**
* Created by nemo on 15/11/15.
*/
public class ConcreteObserver implements Observer {
String name;
public ConcreteObserver(String name) {
this.name = name;
}
public void doWork() {
System.out.println("觀察者" + this.name + "發(fā)現(xiàn)了變化");
}
}