Java 觀察者模式( Observer Pattern),observerpattern
觀察者模式
在對象之間定義一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象都會收到通知,並自動更新
package gx.subject;import gx.observer.Observer;/** * 主題介面 * @author always * */public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObserver();}
package gx.observer;/** * * 接受到通知後 資料顯示的介面 * * @author always * */public interface Display { void display();}
package gx.observer;/** * * 觀察者的介面 * * @author always * */public interface Observer { /** * pull:觀察者自己獲得的想要的資料:“拉” */ void update(); /** * push:主題推送所有訊息給觀察者 * * @param tiltle * @param name * @param summary */ void update(String tiltle,String name,String summary);}
package gx.observer.impl;import gx.observer.Display;import gx.observer.Observer;import gx.subject.Subject;import gx.subject.impl.CurrentSubject;public class StudentObserver implements Observer,Display{ private Subject subject; private String title; private String name; private String summary; public StudentObserver(){ } public StudentObserver(Subject subject){ this.subject=subject; subject.registerObserver(this); } public void update() { if (subject instanceof CurrentSubject) { CurrentSubject cs = (CurrentSubject) subject; this.name=cs.getName(); this.title=cs.getTitle(); this.display(); } } public void update(String title, String name, String summary) { this.title=title; this.name=name; this.summary=summary; this.display(); } public void display() { System.out.println("我是一名學生,今天我訂閱的新聞是:\n 新聞標題:"+title+",新聞作者:"+name+",新聞簡介:"+summary+";"); }}
package gx.observer.impl;import gx.observer.Display;import gx.observer.Observer;import gx.subject.Subject;import gx.subject.impl.CurrentSubject;public class TeacherObserver implements Observer,Display{ private Subject subject; private String title; private String name; private String summary; public TeacherObserver(){ } public TeacherObserver(Subject subject){ this.subject=subject; subject.registerObserver(this); } public void update() { if (subject instanceof CurrentSubject) { CurrentSubject cs = (CurrentSubject) subject; this.name=cs.getName(); this.title=cs.getTitle(); this.display(); } } public void update(String title, String name, String summary) { this.title=title; this.name=name; this.summary=summary; this.display(); } public void display() { System.out.println("我是一名老師,今天我訂閱的新聞是:\n 新聞標題:"+title+",新聞作者:"+name+",新聞簡介:"+summary+";"); }}
package gx.subject.impl;import gx.observer.Observer;import gx.subject.Subject;import java.util.ArrayList;import java.util.List;/** * 這個例子:類比學生,老師 訂閱報紙 * * 此對象改變 依賴它的對象:observerList 中的對象都會收到通知 * setData-->notifyObserver-->observer.update()-->observer.display() * @author always * */public class CurrentSubject implements Subject { private List<Observer> observerList; private String title; private String name; private String summary; public CurrentSubject(){ observerList=new ArrayList<Observer>(); } public void registerObserver(Observer observer) { if(observer!=null){ observerList.add(observer); } } public void removeObserver(Observer observer) { int indexOf = observerList.indexOf(observer); if(indexOf!=-1){ observerList.remove(indexOf); } } public void notifyObserver() { for(Observer observer :observerList){ observer.update(title, name, summary); } } public void setMessage(String title,String name,String summary){ this.title=title; this.name=name; this.summary=summary; notifyObserver(); } public String getTitle() { return title; } public String getName() { return name; } public String getSummary() { return summary; }}
測試類別
package gx.test;import junit.framework.TestCase;import gx.observer.Observer;import gx.observer.impl.StudentObserver;import gx.observer.impl.TeacherObserver;import gx.subject.impl.CurrentSubject;public class TestObserver extends TestCase{ public void testObserverPush(){ CurrentSubject cs= new CurrentSubject(); Observer observer=new StudentObserver(cs); cs.registerObserver(new StudentObserver()); cs.registerObserver(new TeacherObserver()); cs.setMessage("設計模式","白","你好");//主題狀態改變:this.notifyObserver-->observer.update-->observer.display }}