<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    爪哇一角

    共同探討STRUTS#HIBERNATE#SPRING#EJB等技術
    posts - 3, comments - 6, trackbacks - 0, articles - 99
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    觀察者模式

    Posted on 2009-01-20 17:32 非洲小白臉 閱讀(732) 評論(0)  編輯  收藏 所屬分類: 模式
    設計模式-快餐簡解-【觀察者模式】

    觀察者模式應用場景舉例
    比如在玩“極品飛車”這款游戲,每一個車手到達終點的時候,都會在其它車手的屏幕上顯示:某某人以多少時間到達終點的提示,其實這就是一個典型的觀察者模式的應用,觀察者模式即是典型的雙向一對多的應用場景下用一的一端來通知多的一端。

    觀察者模式解釋
    類型:行為模式
      定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象的狀態發生改變時,會通知所有的觀察者對象,使它們能夠自己更新自己。

    觀察者模式UML圖


    觀察者模式-JAVA代碼實現
    新建抽象發布通知父類:
    package carer_subject;

    import java.util.ArrayList;
    import java.util.List;

    import carer_observer.carer_observer;

    public interface carer_subject_parent {

        
    public void set_state(String state_string);

        
    public String get_state();

        
    public void add_observer(carer_observer carer_observer_ref);

        
    public void sub_observer(carer_observer carer_observer_ref);

        
    public void notityAllCarer();

    }


    新建發布通知實現類:


    package carer_subject;

    import java.util.ArrayList;
    import java.util.List;

    import carer_observer.carer_observer;

    public class carer_subject_sub implements carer_subject_parent {

        List
    <carer_observer> list_observer = new ArrayList<carer_observer>();

        
    private String state;

        
    public void set_state(String state_string) {
            
    this.state = state_string;
        }

        
    public String get_state() {
            
    return state;
        }

        
    public void add_observer(carer_observer carer_observer_ref) {
            list_observer.add(carer_observer_ref);
        }

        
    public void sub_observer(carer_observer carer_observer_ref) {
            list_observer.remove(carer_observer_ref);

        }

        
    public void notityAllCarer() {
            state 
    = "到達終點";
            
    for (int i = 0; i < list_observer.size(); i++) {
                list_observer.get(i).show_info();
            }

        }

    }

     

      新建觀察者接口:

    package carer_observer;

    import carer_subject.carer_subject_parent;

    public interface carer_observer {

        
    public void show_info();

    }


    新建觀察者實現類:

    package carer_observer;

    import carer_subject.carer_subject_parent;

    public class carer_observer_imple implements carer_observer {

        
    private carer_subject_parent carer_subject_parent_ref;

        
    public carer_subject_parent getCarer_subject_parent_ref() {
            
    return carer_subject_parent_ref;
        }

        
    public void setCarer_subject_parent_ref(
                carer_subject_parent carer_subject_parent_ref) {
            
    this.carer_subject_parent_ref = carer_subject_parent_ref;
        }

        
    public carer_observer_imple(carer_subject_parent carer_subject_parent_ref) {
            
    super();
            
    this.carer_subject_parent_ref = carer_subject_parent_ref;
        }

        
    public void show_info() {
            System.out.println(carer_subject_parent_ref.get_state());

        }

    }


    新建客戶端運行類:

    package run_main;

    import carer_observer.carer_observer_imple;
    import carer_subject.carer_subject_parent;
    import carer_subject.carer_subject_sub;

    public class run_main {

        
    public static void main(String[] args) {

            carer_subject_parent carer_subject_parent_ref 
    = new carer_subject_sub();

            carer_observer_imple carer_observer_imple_ref1 
    = new carer_observer_imple(
                    carer_subject_parent_ref);
            carer_observer_imple carer_observer_imple_ref2 
    = new carer_observer_imple(
                    carer_subject_parent_ref);
            carer_observer_imple carer_observer_imple_ref3 
    = new carer_observer_imple(
                    carer_subject_parent_ref);
            carer_observer_imple carer_observer_imple_ref4 
    = new carer_observer_imple(
                    carer_subject_parent_ref);

            carer_subject_parent_ref.add_observer(carer_observer_imple_ref1);
            carer_subject_parent_ref.add_observer(carer_observer_imple_ref2);
            carer_subject_parent_ref.add_observer(carer_observer_imple_ref3);
            carer_subject_parent_ref.add_observer(carer_observer_imple_ref4);

            carer_subject_parent_ref.sub_observer(carer_observer_imple_ref3);

            carer_subject_parent_ref.set_state(
    "到達終點");

            carer_subject_parent_ref.notityAllCarer();

        }

    }


    程序運行結果如下:

    到達終點
    到達終點
    到達終點

    以一對多的方式進行對一方狀態的改變而去通知多方,觀察者模式也叫發布/訂閱模式,一方進行發布,而多方進行訂閱,和生活中看報紙一樣,你喜歡訂城市晚報,就會發給你。
    主站蜘蛛池模板: 国产日韩久久免费影院| 亚洲国产精品久久久久秋霞影院 | 国产亚洲综合久久系列| 亚洲无mate20pro麻豆| 亚洲最大成人网色香蕉| 国产免费人成视频在线播放播 | 无码国产精品一区二区免费模式| 18禁无遮挡无码国产免费网站| 亚洲成A人片在线观看无码3D | 亚洲中文字幕精品久久| 久久99热精品免费观看动漫| 成人亚洲网站www在线观看| 亚洲mv国产精品mv日本mv| 国产亚洲美女精品久久| a级毛片在线免费| 国产jizzjizz视频免费看| 亚洲情综合五月天| 亚洲白嫩在线观看| 亚洲AⅤ男人的天堂在线观看| 中国黄色免费网站| 波多野结衣免费在线观看| 久久久久亚洲AV成人无码| 一级毛片试看60分钟免费播放| 午夜无遮挡羞羞漫画免费| 亚洲国产成人精品久久| 日韩免费视频一区二区| 在线观看视频免费国语| 91嫩草亚洲精品| 免费A级毛片在线播放| 亚洲国产另类久久久精品小说| 一级毛片免费播放试看60分钟| 国产在线观看www鲁啊鲁免费| 亚洲精品~无码抽插| 一级毛片免费不卡直观看| 又粗又大又硬又爽的免费视频 | 亚洲国产精品免费视频| 伊人久久大香线蕉亚洲五月天 | 四虎在线成人免费网站| 久久久久亚洲AV片无码下载蜜桃 | 免费观看黄色的网站| 久久久亚洲欧洲日产国码二区 |