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