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();
}
}
程序運行結果如下:
到達終點
到達終點
到達終點
以一對多的方式進行對一方狀態的改變而去通知多方,觀察者模式也叫發布/訂閱模式,一方進行發布,而多方進行訂閱,和生活中看報紙一樣,你喜歡訂城市晚報,就會發給你。