设计模式系列之----观察者模式
觀察者模式是一個(gè)廣播機(jī)制的基礎(chǔ),實(shí)現(xiàn)1對(duì)N的聯(lián)動(dòng),當(dāng)1發(fā)生變化,N跟著相應(yīng)變化,由此衍生了發(fā)布訂閱模式,其方式分兩種,①?gòu)?qiáng)制推送:當(dāng)1發(fā)生變化,強(qiáng)制N也跟著發(fā)生變化,②拉的方式,即N方可以自己決定是否接收,只有當(dāng)N這方有需要時(shí)才去獲取最新的,不然就算1方變化,N這方也不更新。
?觀察者接口和具體實(shí)現(xiàn)類:
/***觀察者接口*/ public interface Observer {void update(Subject subject);//觀察者接收一個(gè)推送過(guò)來(lái)的主題}//============================/***觀察者具體實(shí)現(xiàn)類*/ public class ObserverImpl implements Observer {private int state; //擁有與主體一致的狀態(tài),用于接收訂閱的主題內(nèi)容 public int getState() {return state;}public void setState(int state) {this.state = state;}@Overridepublic void update(Subject subject) {this.state=((ConcreteSubject)subject).getState();//在具體觀察者中進(jìn)行同步狀態(tài)更新}}主題基類和主題具體類
/*** 主體的基類,定義了一些公用方法,沒(méi)有具體主題,也可以定義成抽象類*/ public class Subject {public List<Observer> list=new ArrayList<Observer>();//在主體方定義一個(gè)容器存放注冊(cè)的觀察者public void registerObserver(Observer obs){list.add(obs);//注冊(cè)觀察者,即把需要訂閱的觀察者加進(jìn)容器中}public void removeObserver(Observer obs){list.remove(obs);//移除觀察者}//主題發(fā)生變化時(shí),通知所有觀察者進(jìn)行更新public void notifyAllObservers(List<Observer> list){for (Observer observer : list) {observer.update(this);}}}//=================================================/***有具體主題的子類*/ public class ConcreteSubject extends Subject {private int state;//模擬一個(gè)具體主題public int getState() {return state;}public void setState(int state) {this.state = state;this.notifyAllObservers(list);//此步為關(guān)鍵,當(dāng)主題發(fā)生變化時(shí),主題中注冊(cè)的觀察者的狀態(tài)也跟著進(jìn)行更新} }客戶端調(diào)用:
public static void main(String[] args) {ConcreteSubject concreteSubject = new ConcreteSubject();//目標(biāo)主題,發(fā)布者ObserverImpl observer1=new ObserverImpl();ObserverImpl observer2=new ObserverImpl();ObserverImpl observer3=new ObserverImpl();concreteSubject.registerObserver(observer1);//注冊(cè)觀察者concreteSubject.registerObserver(observer2);concreteSubject.registerObserver(observer3); concreteSubject.setState(1000);//目標(biāo)主題狀態(tài)為1000System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//觀察者的值也都為1000concreteSubject.setState(2000);//目標(biāo)主題狀態(tài)值發(fā)生改變System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//觀察者的值也改為2000}以上代碼是自己實(shí)現(xiàn)的觀察者模式,實(shí)際上JavaSE中已經(jīng)為我們提供了實(shí)現(xiàn)觀察者模式的基礎(chǔ),java.util.Observable類和java.util.Observer接口,通過(guò)這兩個(gè)對(duì)象可以方便的實(shí)現(xiàn)觀察者模式,java.util.Observable相當(dāng)于上面定義的Subject,Observable中定義好了一些常用的方法來(lái)添加觀察者,移除觀察者等,觀察者只要實(shí)現(xiàn)Observer接口就具有觀察者身份,可以被添加進(jìn)來(lái)。
/*** 繼承JDK的Observable類實(shí)現(xiàn)主題*/ public class ConcreteSubject extends Observable{private int state;public int getState() {return state;}public void setState(int state) {this.state = state;super.setChanged();//當(dāng)次屬性發(fā)生改變時(shí),調(diào)用基類的setChanged()方法表示當(dāng)前觀察者有改變,//主要改變super.hasChanged()方法返回值,觀察者可以通過(guò)此值判斷目標(biāo)對(duì)象是否已改變super.notifyObservers(this.state);//把當(dāng)前發(fā)生改變的對(duì)象通知各個(gè)觀察者} }//===================================================/***實(shí)現(xiàn)JDK的觀察者接口,實(shí)現(xiàn)更新方法*/ public class ObserverImpl implements Observer {private int state; public int getState() {return state;}public void setState(int state) {this.state = state;}@Overridepublic void update(Observable o, Object obj) {setState(((ConcreteSubject)o).getState());//this.state =Integer.parseInt((String)obj);//也可以直接通過(guò)傳遞過(guò)來(lái)的參數(shù)賦值} }//==================================================public static void main(String[] args) {ConcreteSubject subject=new ConcreteSubject();ObserverImpl observer1=new ObserverImpl();ObserverImpl observer2=new ObserverImpl();ObserverImpl observer3=new ObserverImpl();subject.addObserver(observer1);subject.addObserver(observer2);subject.addObserver(observer3);subject.setState(10);System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//觀察者的值也都為1000subject.setState(2000);//目標(biāo)主題狀態(tài)值發(fā)生改變System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//觀察者的值也改為2000}JavaEE中監(jiān)聽(tīng)器就使用的是觀察者模式
轉(zhuǎn)載于:https://www.cnblogs.com/javabg/p/7443399.html
總結(jié)
以上是生活随笔為你收集整理的设计模式系列之----观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 软件开发模式分类
- 下一篇: gerrit上sshkey设置问题