亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

設計模式(十三)觀察者模式

2019-11-14 21:13:06
字體:
來源:轉載
供稿:網友
設計模式(十三)觀察者模式觀察者模式 Observer

觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。

這個主題對象在狀態上發生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己。

觀察者模式的組成

抽象主題角色:把所有對觀察者對象的引用保存在一個集合中,每個抽象主題角色都可以有任意數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者角色。一般用一個抽象類和接口來實現。

抽象觀察者角色:為所有具體的觀察者定義一個接口,在得到主題的通知時更新自己。

具體主題角色:在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色通常用一個子類實現。

具體觀察者角色:該角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。通常用一個子類實現。如果需要,具體觀察者角色可以保存一個指向具體主題角色的引用。

Code
//抽象觀察者角色public interface Watcher{    public void update(String str);}

定義抽象的主題角色,即抽象的被觀察者,在其中聲明方法(添加、移除觀察者,通知觀察者):

//抽象主題角色,watched:被觀察public interface Watched{    public void addWatcher(Watcher watcher);    public void removeWatcher(Watcher watcher);    public void notifyWatchers(String str);}

定義具體的觀察者:

public class ConcreteWatcher implements Watcher{    @Override    public void update(String str)    {        System.out.PRintln(str);    }}

具體的主題角色:

import java.util.ArrayList;import java.util.List;public class ConcreteWatched implements Watched{    // 存放觀察者    private List<Watcher> list = new ArrayList<Watcher>();    @Override    public void addWatcher(Watcher watcher)    {        list.add(watcher);    }    @Override    public void removeWatcher(Watcher watcher)    {        list.remove(watcher);    }    @Override    public void notifyWatchers(String str)    {        // 自動調用實際上是主題進行調用的        for (Watcher watcher : list)        {            watcher.update(str);        }    }}

編寫測試類:

public class Test{    public static void main(String[] args)    {        Watched girl = new ConcreteWatched();                Watcher watcher1 = new ConcreteWatcher();        Watcher watcher2 = new ConcreteWatcher();        Watcher watcher3 = new ConcreteWatcher();                girl.addWatcher(watcher1);        girl.addWatcher(watcher2);        girl.addWatcher(watcher3);                girl.notifyWatchers("開心");    }}
Observable類

Observable類用于創建可以觀測到你的程序中其他部分的子類。當這種子類的對象發生變化時,觀測類被通知。

觀測類必須實現定義了update()方法的Observer接口。

當一個觀測程序被通知到一個被觀測對象的改變時,update()方法被調用。

顯然,Observable是一個抽象的主題對象

一個被觀測的對象必須服從下面的兩個簡單規則:

  第一,如果它被改變了,它必須調用setChanged()方法。

  第二,當它準備通知觀測程序它的改變時,它必須調用notifyObservers()方法,這導致了在觀測對象中對update()方法的調用。

注意:如果在調用notifyObservers()方法之前沒有調用setChanged()方法,就不會有什么動作發生。

  notifyObservers()方法中包含clearChanged()方法,將標志變量置回原值。

  notifyObservers()方法采用的是從后向前的遍歷方式,即最后加入的觀察者最先被調用update()方法。

Code

定義一個主題對象進行倒數計數,數字每次改變時,它的觀察者收到這個數字。

一個觀察者每次收到通知后打印出數字,另一個觀察者在數字小于等于5時才開始打印。

import java.util.Observable;import java.util.Observer;class WatchedCounter extends Observable{    public void countdown(int number)    {        for (; number >= 0; --number)        {            // 設置改變變量            setChanged();            // 通知所有觀察者,將number作為參數信息傳遞給觀察者            notifyObservers(number);        }    }}class Watcher1 implements Observer{    @Override    public void update(Observable arg0, Object arg1)    {        System.out.println("Watcher1's number: " + arg1);    }}class Watcher2 implements Observer{    @Override    public void update(Observable arg0, Object arg1)    {        if (((Integer) arg1).intValue() <= 5)        {            System.out.println("Watcher2's number: " + arg1);        }    }}public class ObserverTest{    public static void main(String[] args)    {        WatchedCounter watchedCounter = new WatchedCounter();        Watcher1 watcher1 = new Watcher1();        Watcher2 watcher2 = new Watcher2();        //添加觀察者        watchedCounter.addObserver(watcher1);        watchedCounter.addObserver(watcher2);        //開始倒數計數        watchedCounter.countdown(10);    }}
我是天王蓋地虎的分割線

參考:http://www.49028c.com/mengdd/archive/2013/02/08/2909206.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
北条麻妃一区二区在线观看| 国产精品精品久久久| 欧美日韩xxx| 国产精品第二页| 亚洲欧美日韩一区在线| 日韩成人激情在线| 欧美极品在线视频| 国产精品偷伦视频免费观看国产| 狠狠色噜噜狠狠狠狠97| 国产成人av网| 亚洲午夜精品视频| 欧美日韩在线观看视频| 精品国产一区二区在线| 国产欧美日韩精品在线观看| 尤物yw午夜国产精品视频| 亚洲人成自拍网站| 欧美激情精品久久久久久蜜臀| 久久好看免费视频| 久久精品在线视频| 91精品美女在线| 最近2019中文免费高清视频观看www99| 成人久久一区二区三区| 久久在线免费视频| 国产一区二区免费| 国产免费一区视频观看免费| 日韩精品在线第一页| 91精品啪在线观看麻豆免费| 亚洲欧美精品一区二区| 成人精品久久av网站| 日韩福利在线播放| 神马久久桃色视频| 亚洲xxx自由成熟| 亚洲在线免费观看| 亚洲自拍在线观看| 成人激情视频免费在线| 亚洲精品网址在线观看| 两个人的视频www国产精品| 亚洲精品久久久久中文字幕二区| 性色av一区二区三区红粉影视| 欧美网站在线观看| 91爱视频在线| 欧美日韩国产一区中文午夜| 国产精品自产拍高潮在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 97色在线观看| 国产精品av在线播放| 欧美电影免费观看高清完整| 狠狠躁夜夜躁人人爽天天天天97| 亚洲欧美成人精品| 精品一区二区三区电影| 影音先锋欧美精品| 国产精品日韩在线| 日韩精品极品视频| www国产亚洲精品久久网站| 亚洲色图50p| 国产在线拍揄自揄视频不卡99| 在线播放国产一区二区三区| 狠狠做深爱婷婷久久综合一区| 国产91对白在线播放| 国产成人精品免高潮费视频| 日韩高清av在线| 国产剧情久久久久久| 亚洲国产精品久久久久| 色香阁99久久精品久久久| 久久久久久久国产精品视频| 亚洲第一福利网站| 日韩欧美在线国产| 这里只有精品在线观看| 亚洲精品久久久久| 欧美激情区在线播放| 国产精品成人一区| 综合136福利视频在线| 日韩精品欧美国产精品忘忧草| 亚洲国产精品va在看黑人| 国产精品视频一区二区三区四| 久久久在线观看| 久久99国产精品自在自在app| 日韩欧美成人精品| 欧美风情在线观看| 久久久久久国产免费| 久久婷婷国产麻豆91天堂| 精品视频www| 国产精品自产拍在线观看中文| 日韩av不卡电影| 亚洲成色www8888| 国产成人aa精品一区在线播放| 欧美另类极品videosbestfree| 国产日韩在线免费| 综合国产在线观看| 亚洲精品白浆高清久久久久久| 性色av一区二区三区免费| 久久久久久尹人网香蕉| 欧美老女人xx| 欧美高清不卡在线| 亚洲精品国产精品乱码不99按摩| 欧美性猛交xxxxx免费看| 精品久久久久久中文字幕一区奶水| 黑人巨大精品欧美一区二区免费| 国产精品观看在线亚洲人成网| 亚洲最新视频在线| 国产精品久久久久久久app| 国产精品第二页| 全亚洲最色的网站在线观看| 成人激情视频在线观看| 国产精品吹潮在线观看| 欧美日韩第一视频| 日产精品99久久久久久| 欧美电影电视剧在线观看| 91在线精品视频| 亚洲欧美日韩国产成人| 日韩在线视频国产| 69久久夜色精品国产69乱青草| 91精品国产高清| 青青久久av北条麻妃海外网| 国产成人精品av| 青青久久aⅴ北条麻妃| 欧美激情伊人电影| 羞羞色国产精品| 亚洲成人激情小说| 亚洲人成电影网| 日韩精品久久久久久久玫瑰园| 成人网在线免费看| 成人av在线网址| 久久精品国产精品亚洲| 久久综合五月天| 成人国产精品免费视频| 国产欧美一区二区三区在线| 性色av一区二区三区在线观看| 另类图片亚洲另类| 久久精品视频在线| 久久精品青青大伊人av| 欧美精品久久久久久久久久| 欧美美女18p| 国外色69视频在线观看| 日韩极品精品视频免费观看| 精品magnet| 日本成人黄色片| 亚洲va欧美va在线观看| 亚洲风情亚aⅴ在线发布| 欧美性猛交xxxx久久久| 欧美一级视频在线观看| 欧美国产日本在线| 国产精品日日做人人爱| 欧美另类极品videosbest最新版本| 在线色欧美三级视频| 欧美日韩在线视频观看| 视频在线观看99| 亚洲精品久久久久久久久久久| 日韩高清av一区二区三区| 91视频国产精品| 国产女精品视频网站免费| 亚洲国产精品人久久电影| 亚洲人成电影在线播放| 国产a∨精品一区二区三区不卡| 亚洲国产免费av| 日韩高清电影免费观看完整版| 国产一区二区在线免费视频| 91九色国产社区在线观看| 国产精品综合久久久| 欧洲亚洲在线视频| 91豆花精品一区| 欧美成人精品h版在线观看| 中文字幕在线观看日韩| 亚洲视频综合网|