日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php框架 > 框架設(shè)計(jì) > 觀察者模式

觀察者模式

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-04-22 07:52:29 閱讀次數(shù):3634次

《Head First Design Pattern》1書(shū)中對(duì)視察者模式的定義以下:
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.

視察者設(shè)計(jì)模式定義了對(duì)象間的1種1對(duì)多的依賴關(guān)系,以便1個(gè)對(duì)象的狀態(tài)產(chǎn)生變化時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)刷新。
從根本上說(shuō),該模式必須包括兩個(gè)角色:視察者和被視察對(duì)象。下面是設(shè)計(jì)模式中包括角色的UML類圖(來(lái)自百度百科)。

觀察者模式

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

下面舉這樣1個(gè)例子:比如1個(gè)小游戲,A說(shuō)出1個(gè)10進(jìn)制的數(shù),B說(shuō)出其對(duì)應(yīng)的2進(jìn)制結(jié)果,C說(shuō)出其對(duì)應(yīng)的8進(jìn)制結(jié)果,D說(shuō)出其對(duì)應(yīng)的106進(jìn)制結(jié)果。
使用視察者模式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(); }

實(shí)體被視察者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(); } } }

實(shí)體視察者B:游戲中的B,將A給的數(shù)字轉(zhuǎn)成2進(jìn)制

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)); } } }

實(shí)體視察者D:游戲中的D,將A給的數(shù)字轉(zhuǎn)成106進(jìn)制

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)); } } }

視察者模式測(cè)試代碼:我們開(kāi)始做游戲了

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); } }

運(yùn)行結(jié)果:

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

其實(shí)Java JDK本身提供了設(shè)計(jì)模式等額實(shí)現(xiàn):
java.util.Observer是1個(gè)接口,視察者接口,相當(dāng)于我們上面的IObserver接口。我們需要實(shí)現(xiàn)1個(gè)視察者的時(shí)候只需要實(shí)現(xiàn)這個(gè)接口就OK了。
java.util.Observable是1個(gè)類,被視察者類,我們需要實(shí)現(xiàn)1個(gè)被視察者的時(shí)候只需要繼承這個(gè)類就OK了。

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 午夜精品久久久久久久96蜜桃 | 三区四区在线 | 亚洲国产天堂 | 久久免费看 | www色av| 国产日韩视频在线 | 精品久久久久久久久久久久久久久久久久久 | 国产最新在线 | 国产成人精品免费视频 | 99精品欧美一区二区三区 | 精品一区二区三区成人精品 | 日本xxxxwwww| 中文字幕一区二区三区在线观看 | av福利在线播放 | 日韩精品免费在线 | 天天插天天 | 伊人国产精品 | 久久久久久久国产 | 91一区二区 | 日韩国产精品一区二区 | 欧美videosdesex高潮 | 天堂成人国产精品一区 | 综合久久狠狠色成人网 | 尤物av| 午夜精品福利一区二区三区蜜桃 | 久在线视频 | 国产一区二区成人在线 | 国产精品99久久久久久久久 | 国产一区免费视频 | 国产亚洲精品久久久久久 | 久久99精品久久久久久国产越南 | 国产午夜亚洲精品理论片色戒 | 欧美xxxx网站 | 国产精品国产三级国产a | 国产精品久久久 | 欧美一区永久视频免费观看 | 国产免费av一区二区三区 | 精品一区二区三区国产 | 色婷婷一区二区三区 | 免费看的黄色网 | 亚洲精品久久久久 |