麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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.companysz.com/mengdd/archive/2013/02/08/2909206.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 一级做a爱视频 | 国产又粗又爽又深的免费视频 | 国产亚洲精品成人a | 亚洲一级片在线观看 | 91成人影库 | 久久久久久久久久久高潮一区二区 | 极品美女一级毛片 | 亚洲综合精品成人 | 国产精品爆操 | 欧美日韩大片在线观看 | 免费一级欧美大片视频 | 午夜视 | av成人免费看 | 久久超| 免费一级毛片免费播放 | 久久9色| 在线成人免费视频 | 黄网站免费在线看 | www.91成人 | 国产精品成人一区二区三区吃奶 | 天天好比网| 黄色特级一级片 | 中文字幕欧美一区二区三区 | 91色一区二区三区 | 一级黄色播放 | 激情影院在线观看 | 久久精品一区二区三 | av在线免费观看中文字幕 | 欧美一级免费在线观看 | 369看片你懂的小视频在线观看 | 日本网站一区二区三区 | 国产第一页精品 | 羞羞网站在线观看入口免费 | 中文字幕在线观看视频一区 | av在线播放免费观看 | 中文欧美日韩 | 日韩黄色影视 | 亚洲国产精品一区二区久久 | 精品小视频 | 黄网站色成年大片免费高 | 国产女做a爱免费视频 |