国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 禹州市| 荔波县| 嘉峪关市| 长兴县| 嘉禾县| 石泉县| 米林县| 西贡区| 三门县| 柳林县| 双牌县| 郴州市| 宣汉县| 鄂伦春自治旗| 临湘市| 彩票| 永嘉县| 运城市| 北辰区| 吴江市| 龙江县| 永登县| 长寿区| 宿迁市| 舞阳县| 海门市| 禹州市| 青河县| 桂东县| 武安市| 龙门县| 禄丰县| 南和县| 延川县| 南郑县| 东兴市| 锡林浩特市| 沿河| 黔江区| 保山市| 齐河县|