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

        }

    }


    程序運行結果如下:

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

    以一對多的方式進行對一方狀態的改變而去通知多方,觀察者模式也叫發布/訂閱模式,一方進行發布,而多方進行訂閱,和生活中看報紙一樣,你喜歡訂城市晚報,就會發給你。
    主站蜘蛛池模板: caoporn国产精品免费| 亚洲av日韩专区在线观看| 日韩精品无码免费专区午夜不卡| 免费一区二区视频| 黄色免费网站在线看| 免费看一级做a爰片久久| 无码的免费不卡毛片视频| 国产亚洲精品a在线观看| 两个人日本WWW免费版| 亚洲色欲久久久综合网| 伊人久久大香线蕉免费视频| 日本亚洲成高清一区二区三区 | 成人免费在线观看网站| 亚洲精品V天堂中文字幕| 国产传媒在线观看视频免费观看 | 亚洲偷自拍拍综合网| 久草免费福利在线| 亚洲综合国产精品| 久久精品免费一区二区喷潮 | 亚洲精品色播一区二区| 日韩亚洲国产综合久久久| 国产视频精品免费视频| 亚洲第一网站免费视频| 大学生美女毛片免费视频| 一区二区三区免费视频观看| 亚洲av不卡一区二区三区| 少妇高潮太爽了在线观看免费| 婷婷国产偷v国产偷v亚洲| 国产亚洲AV夜间福利香蕉149| 香港a毛片免费观看| 33333在线亚洲| 亚洲国产精品自产在线播放 | 粉色视频免费入口| 亚洲av无码一区二区乱子伦as | 亚洲丝袜美腿视频| 大地资源二在线观看免费高清| 午夜成人无码福利免费视频| 久久精品国产96精品亚洲 | 国产乱辈通伦影片在线播放亚洲 | 免费A级毛片在线播放| 亚洲爆乳无码精品AAA片蜜桃|