Java觀察者模式的淺析
簡單地說,觀察者模式定義了一個一對多的依賴關係,讓一個或多個觀察者物件監察一個主題物件。這樣一個主題物件在狀態上的變化能夠通知所有的依賴於此物件的那些觀察者物件,使這些觀察者物件能夠自動更新。
在觀察者模式裡有如下的角色:
抽象主題(Subject)角色:
主題角色把所有的觀察者物件的引用儲存在一個列表裡;每個主題都可以有任何數量的觀察者。主題提供一個介面可以加上或撤銷觀察者物件;主題角色又叫做抽象被觀察者(Observable)角色;
抽象觀察者(Observer)角色:
為所有的具體觀察者定義一個介面,在得到通知時更新自己;
具體主題(ConcreteSubject)角色:
儲存對具體觀察者物件有用的內部狀態;在這種內部狀態改變時給其觀察者發出一個通知;具體主題角色又叫作具體被觀察者角色
具體觀察者(ConcreteObserver)角色:
儲存一個指向具體主題物件的引用;和一個與主題的狀態相符的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新自己的介面,以便使本身的狀態與主題的狀態自恰。
繼承關係(此例項簡化了abstract subject類):
程式碼實現:
(1)建立Subject類
package study_02.designpattern.observer;
import java.util.ArrayList;
import java.util.List;
/**
* Create <strong>Subject</strong> class.
* @author WWX
*
*/
public class Subject {
private List<Observer> observers
= new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
(2)建立Oberver抽象類或介面
package study_02.designpattern.observer;
/**
* Create <strong>Observer</strong> class
* @author WWX
*
*/
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
(3)建立繼承了Oberver介面Concrete Oberver類
package study_02.designpattern.observer;
/**
* Create <strong>concrete observer</strong> classes
* @author WWX
*
*/
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Binary String: "
+ Integer.toBinaryString(subject.getState()));
}
}
package study_02.designpattern.observer;
/**
* Create <strong>concrete observer</strong> classes
* @author WWX
*/
public class HexaObserver extends Observer {
public HexaObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Hex String: "
+ Integer.toHexString(subject.getState()).toUpperCase());
}
}
package study_02.designpattern.observer;
/**
* Create <strong>concrete observer</strong> classes
* @author WWX
*/
public class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Octal String: "
+ Integer.toOctalString(subject.getState()));
}
}
(4)使用Subject和Concrete Oberver物件
package study_02.designpattern.observer;
/**
*
* @author WWX
*/
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}