設計模式之-觀察者模式(Observer)

觀察者(Observer)模式標準定義:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時, 全部依賴於它的對象都獲得通知並被自動更新。html

觀察者(Observer)模式屬於對象行爲型模式。觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知全部觀察者對象,使他們可以自動更新本身。這一模式中主要針對兩個對象object和Observer。一個object能夠有多個Observer,當—個object對象的狀態發生改變時,全部依賴於它的Observer對象都獲得通知被自動更新。java

在JDK中定義了觀察者模式:ide

subject -> java.util.Observable(類)測試

observer -> java.util.Observer(接口).net

使用jdk自帶的觀察者模式的缺點:server

1.Observable是一個類,而不是一個接口,致使Observable類的擴展性不高,不如本身實現的觀察者模式靈活。htm

2.Observable將某些方法保護了起來(setChanged()和clearChanged()爲protected),這意味着除非繼承自Observable,不然將有關鍵的方法不能調用。致使沒法經過組合的方式使其它類得到Observable類的功能。對象

同時.Spring的事件驅動模型使用的是觀察者模式。blog

示例:https://www.cnblogs.com/fingerboy/p/6393644.html繼承

 

如下爲本身代碼實現的觀察者模式,舉例爲主人(被觀察者)和動物(觀察者)的故事。

 

/**

*

* @describe:被觀察者(主題)接口

*

*/

public interface Subject {

    //添加觀察者

    public void addObserver(Observer obj);

    //移除觀察者

    public void deleteObserver(Observer obj);

    //當主題方法改變時,這個方法被調用,通知全部的觀察者

    public void notifyObserver();

}

 

/**

*

* @describe:定義一個主人的被觀察這對象:男主人

*

*/

public class MasterSubject implements Subject,Runnable{

    String name="男主人";

    List<Observer> observers=new ArrayList<Observer>();

 

    @Override

    public void addObserver(Observer obj) {

        if(!observers.contains(obj)){

        observers.add(obj);

    }

}

 

@Override

public void deleteObserver(Observer obj) {

    if(observers.contains(obj)){

    observers.remove(obj);

    }

}

 

@Override

public void notifyObserver() {

    for(Observer observer : observers){

    observer.update(name);

    }

}

 

@Override

public void run() {

    try {

    Thread.sleep(3000);

    notifyObserver();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

}

}

 

/**

*

* @describe:觀察者接口

*

*/

public interface Observer {

    public abstract void update(String name);

}

 

/**

*

* @describe:定義小狗觀察者

*

*/

public class DogObserver implements Observer{

    String message="汪汪汪";

    @Override

    public void update(String name) {

        System.out.println(name+"回來了"+message);

    }

}

 

/**

*

* @describe:定義小貓觀察者

*

*/

public class CatObserver implements Observer{

    String message="喵喵喵";

    @Override

    public void update(String name) {

        System.out.println(name+"回來了"+message);

    }

}

 

/**

*

* @describe:測試類

*

*/

public class Test {

    public static void main(String[] args) {

        MasterSubject subject=new MasterSubject();

        Observer dog=new DogObserver();

        Observer cat=new CatObserver();

        subject.addObserver(dog);

        subject.addObserver(cat);

        new Thread(subject).start();

    }

}

 

運行結果:

男主人回來了汪汪汪

男主人回來了喵喵喵

相關文章
相關標籤/搜索