多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > 觀察者模式

觀察者模式

來源:程序員人生   發布時間:2015-04-22 07:52:29 閱讀次數:3630次

《Head First Design Pattern》1書中對視察者模式的定義以下:
The Observer Pattern defines a one-to-many dependency objects so that when one object changes state, all of its dependents are notified and updated automatically.

視察者設計模式定義了對象間的1種1對多的依賴關系,以便1個對象的狀態產生變化時,所有依賴于它的對象都得到通知并自動刷新。
從根本上說,該模式必須包括兩個角色:視察者和被視察對象。下面是設計模式中包括角色的UML類圖(來自百度百科)。

觀察者模式

視察者(Observer)將自己注冊到被視察對象(Subject)中,被視察對象將視察者寄存在1個容器(Container)里。
被視察對象(Subject)產生了某種變化,從容器中得到所有注冊過的視察者,將變化通知視察者。

下面舉這樣1個例子:比如1個小游戲,A說出1個10進制的數,B說出其對應的2進制結果,C說出其對應的8進制結果,D說出其對應的106進制結果。
使用視察者模式A可以作為被視察者(Subject),B、C、D可以作為視察者(Observer)。

下面是Java代碼示例:
視察者接口:

public interface IObserver { public void update(); }

被視察者接口:

public interface ISubject { public void addObserver(IObserver o); public void deleteObserver(IObserver o); public void notifyObservers(); }

實體被視察者A:就是游戲中的A

public class Number implements ISubject { private List<IObserver> observers; private int number; public Number() { observers = new ArrayList<IObserver>(); } public void setNumber(int number) { this.number = number; notifyObservers(); } public int getNumber() { return number; } @Override public void addObserver(IObserver o) { observers.add(o); } @Override public void deleteObserver(IObserver o) { observers.remove(o); } @Override public void notifyObservers() { for (IObserver observer : observers) { observer.update(); } } }

實體視察者B:游戲中的B,將A給的數字轉成2進制

public class BinTranslator implements IObserver { private ISubject subject; public BinTranslator(Number number) { subject = number; subject.addObserver(this); } @Override public void update() { if (subject instanceof Number) { Number number = (Number) subject; int inum = number.getNumber(); System.out.println(inum + "=" + Integer.toBinaryString(inum)); } } }

實體視察者D:游戲中的D,將A給的數字轉成106進制

public class HexTranslator implements IObserver { private ISubject subject; public HexTranslator(Number number) { subject = number; subject.addObserver(this); } @Override public void update() { if (subject instanceof Number) { Number number = (Number) subject; int inum = number.getNumber(); System.out.println(inum + "=0x" + Integer.toHexString(inum)); } } }

視察者模式測試代碼:我們開始做游戲了

public class ObserverPattern { @SuppressWarnings("unused") public static void main(String[] args) { Number number = new Number(); IObserver bin = new BinTranslator(number); IObserver hex = new HexTranslator(number); number.setNumber(12); number.setNumber(-1); } }

運行結果:

12=1100 12=0xc ⑴=11111111111111111111111111111111 ⑴=0xffffffff

其實Java JDK本身提供了設計模式等額實現:
java.util.Observer是1個接口,視察者接口,相當于我們上面的IObserver接口。我們需要實現1個視察者的時候只需要實現這個接口就OK了。
java.util.Observable是1個類,被視察者類,我們需要實現1個被視察者的時候只需要繼承這個類就OK了。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日产精品久久久一区二区 | 欧美日韩亚洲国产一区二区综合 | 欧美国产一区二区三区 | 国产亚洲免费观看 | 伊人久久成人成综合网222 | 一级一级一级毛片免费毛片 | 国产性老妇女做爰在线 | 国产高清视频在线观看不卡v | 在线满18网站观看视频 | 国产精品jizz在线观看软件 | 国产福利网站 | 老年人一级特黄aa大片 | 福利视频100 | 日韩综合色| 免费黄色福利 | 外国美女一级片 | 美女网站免费看 | 男女爽爽无遮挡午夜视频在线观看 | 看日本黄色大片 | 精品无人乱码一区二区三区 | 欧美xxx性| 国产精品久久久久久久毛片 | 伊甸园久久网站 | 久久久久久一级毛片免费无遮挡 | 韩国三级一线观看久 | 日本.www| 精品国产一区二区三区四区不 | 亚洲精品国产第一区二区图片 | 国产精品国产三级在线高清观看 | 欧美一级高清片在线 | 成人国产精品久久久免费 | 国产第一页在线观看 | 永久在线观看www免费视频 | 图片区小说区av区 | 伊人情人综合 | 国产成人麻豆精品 | 国产精品国产三级国产在线观看 | 日韩欧美国产一区二区三区四区 | 亚洲色图第1页 | 国内精品久久久久影院网站 | 欧美性xxxx巨大黑人猛 |