熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

設計模式-快餐簡解-【觀察者模式】

2013-11-23 19:40:25  來源: Java高級技術 

  【觀察者模式應用場景舉例

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

  【觀察者模式解釋

  類型行為模式

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

  【觀察者模式UML圖

  

  【觀察者模式JAVA代碼實現

  新建抽象發布通知父類

   package carer_subject;

import javautilArrayList;
import javautilList;

import carer_observercarer_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 javautilArrayList;
import javautilList;

import carer_observercarer_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) {
        thisstate = state_string;
    }

    public String get_state() {
        return state;
    }

    public void add_observer(carer_observer carer_observer_ref) {
        list_observeradd(carer_observer_ref);
    }

    public void sub_observer(carer_observer carer_observer_ref) {
        list_observerremove(carer_observer_ref);

    }

    public void notityAllCarer() {
        state = 到達終點;
        for (int i = ; i < list_observersize(); i++) {
            list_observerget(i)show_info();
        }

    }

}

  新建觀察者接口

   package carer_observer;

import carer_subjectcarer_subject_parent;

public interface carer_observer {

    public void show_info();

}

  新建觀察者實現類

   package carer_observer;

import carer_subjectcarer_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) {
        thiscarer_subject_parent_ref = carer_subject_parent_ref;
    }

    public carer_observer_imple(carer_subject_parent carer_subject_parent_ref) {
        super();
        thiscarer_subject_parent_ref = carer_subject_parent_ref;
    }

    public void show_info() {
        Systemoutprintln(carer_subject_parent_refget_state());

    }

}

  新建客戶端運行類

   package run_main;

import carer_observercarer_observer_imple;
import carer_subjectcarer_subject_parent;
import carer_subjectcarer_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_ref = new carer_observer_imple(
                carer_subject_parent_ref);
        carer_observer_imple carer_observer_imple_ref = new carer_observer_imple(
                carer_subject_parent_ref);
        carer_observer_imple carer_observer_imple_ref = new carer_observer_imple(
                carer_subject_parent_ref);
        carer_observer_imple carer_observer_imple_ref = new carer_observer_imple(
                carer_subject_parent_ref);

        carer_subject_parent_refadd_observer(carer_observer_imple_ref);
        carer_subject_parent_refadd_observer(carer_observer_imple_ref);
        carer_subject_parent_refadd_observer(carer_observer_imple_ref);
        carer_subject_parent_refadd_observer(carer_observer_imple_ref);

        carer_subject_parent_refsub_observer(carer_observer_imple_ref);

        carer_subject_parent_refset_state(到達終點);

        carer_subject_parent_refnotityAllCarer();

    }

}

  程序運行結果如下

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

  以一對多的方式進行對一方狀態的改變而去通知多方觀察者模式也叫發布/訂閱模式一方進行發布而多方進行訂閱和生活中看報紙一樣你喜歡訂城市晚報就會發給你

  【觀察者模式MyEclipse項目JAVA代碼實現

  觀察者模式observer示例代碼點擊


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27277.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.