行爲型模式-Observer ( 觀察者模式 )

摘自《Java設計模式(瘋狂JAVA聯盟版)》


觀察者模式
 概述
    定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
 適用性
    1.當一個抽象模型有兩個方面,其中一個方面依賴於另一方面。
      將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和複用。

    2.當對一個對象的改變需要同時改變其它對象,而不知道具體有多少對象有待改變。

    3.當一個對象必須通知其它對象,而它又不能假定其它對象是誰。
			
 參與者
    1.Subject(目標)
      目標知道它的觀察者。可以有任意多個觀察者觀察同一個目標。
      提供註冊和刪除觀察者對象的接口。

    2.Observer(觀察者)
      爲那些在目標發生改變時需獲得通知的對象定義一個更新接口。

    3.ConcreteSubject(具體目標)
      將有關狀態存入各ConcreteObserver對象。
      當它的狀態發生改變時,向它的各個觀察者發出通知。

    4.ConcreteObserver(具體觀察者)
      維護一個指向ConcreteSubject對象的引用。
      存儲有關狀態,這些狀態應與目標的狀態保持一致。
      實現Observer的更新接口以使自身狀態與目標的狀態保持一致
 類圖
 例子
Subject
public abstract class Citizen {
    
    List pols;
    
    String help = "normal";
    
    public void setHelp(String help) {
        this.help = help;
    }
    
    public String getHelp() {
        return this.help;
    }
    
    abstract void sendMessage(String help);

    public void setPolicemen() {
        this.pols = new ArrayList();
    }
    
    public void register(Policeman pol) {
        this.pols.add(pol);
    }

    public void unRegister(Policeman pol) {
        this.pols.remove(pol);
    }
}
Observer
public interface Policeman {

    void action(Citizen ci);
}
ConcreteSubject
public class HuangPuCitizen extends Citizen {

    public HuangPuCitizen(Policeman pol) {
        setPolicemen();
        register(pol);
    }
    
    public void sendMessage(String help) {
        setHelp(help);
        for(int i = 0; i < pols.size(); i++) {
            Policeman pol = pols.get(i);
            //通知警察行動
            pol.action(this);
        }
    }
}
public class TianHeCitizen extends Citizen {

    public TianHeCitizen(Policeman pol) {
        setPolicemen();
        register(pol);
    }
    
    public void sendMessage(String help) {
        setHelp(help);
        for (int i = 0; i < pols.size(); i++) {
            Policeman pol = pols.get(i);
            //通知警察行動
            pol.action(this);
        }
    }
}
ConcreteObserver
public class HuangPuPoliceman implements Policeman {

    public void action(Citizen ci) {
        String help = ci.getHelp();
        if (help.equals("normal")) {
            System.out.println("一切正常, 不用出動");
        }
        if (help.equals("unnormal")) {
            System.out.println("有犯罪行爲, 黃埔警察出動!");
        }
    }
}
public class TianHePoliceman implements Policeman {

    public void action(Citizen ci) {
        String help = ci.getHelp();
        if (help.equals("normal")) {
            System.out.println("一切正常, 不用出動");
        }
        if (help.equals("unnormal")) {
            System.out.println("有犯罪行爲, 天河警察出動!");
        }
    }
}
Test
public class Test{

    public static void main(String[] args) {
        Policeman thPol = new TianHePoliceman();
        Policeman hpPol = new HuangPuPoliceman();
        
        Citizen citizen = new HuangPuCitizen(hpPol);
        citizen.sendMessage("unnormal");
        citizen.sendMessage("normal");
        
        System.out.println("===========");
        
        citizen = new TianHeCitizen(thPol);
        citizen.sendMessage("normal");
        citizen.sendMessage("unnormal");
    }
}
result
有犯罪行爲, 黃埔警察出動!
一切正常, 不用出動
===========
一切正常, 不用出動
有犯罪行爲, 天河警察出動!

發佈了17 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章