Java設計模式之觀察者模式(生產者與消費者模式)


 

生活中我們經常遇到觀察者模式的案例。

例如,我們去商場購物,注冊了一家店的會員,一旦這家店有活動,你的手機就會收到一些推送消息,是不是?

在例如,我們看某個電視台的節目,這個電視台放什么節目我們就會看到什么節目。

這些都是典型的生產者與消費者的案例。

所謂的觀察者模式,定義了一種一對多的依賴關系,能夠讓多個觀察者訂閱某個主題,當這個主題發生變化的時候,主題會通知這些訂閱者,那么觀察者就會自動更新變化。

我們以天氣預告為例,tom和jack,都訂閱了手機天氣預告功能,那么天氣預告會每天進行通知tom和jack,tom和jack就會收到天氣預報,一旦天氣預報發生變化,tom和jack也會收到這些通知。

下面看具體實現。

//===========Observer.java===============

//抽象類,觀察者,具體的觀察這將到子類實現

public abstract class Observer {

    public abstract void update();

}

//===========Subject.java===============

//主題

 

public class Subject {

    //保存多個觀察者(就是訂閱該主題的人)

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

    /**

     * 增加觀察者

     * @param observer

     */

    public void addObserver(Observer observer){

        observers.add(observer);

    }

    /**

     * 移除觀察者

     * @param observer

     */

    public void removeObserver(Observer observer){

        observers.remove(observer);

    }

    /**

     * 通知觀察者

     */

    public void notifyObserver(){

        for (Observer observer : observers) {

            observer.update();

        }

    }

}

//===========ConcreteSubject.java===============

//具體的某個主題

 

public class ConcreteSubject extends Subject {

    //主題消息內容

    private String subjectState;

    public String getSubjectState() {

        return subjectState;

    }

    public void setSubjectState(String subjectState) {

        this.subjectState = subjectState;

    }

}

//===========ConcreteObserver.java===============

//具體的某個觀察者

 

public class ConcreteObserver extends Observer {

    private String name;

    private String observerState;

    private ConcreteSubject subject;

    public ConcreteObserver(ConcreteSubject subject,String name){

        this.subject=subject;

        this.name=name;

    }

    @Override

    public void update() {

        observerState=subject.getSubjectState();

        System.out.println(String.format("%s的收到消息,內容是:%s", name,observerState));

    }

}

//===========MainTest.java===============

 

public static void main(String[] args) {

    //主題

    ConcreteSubject subject=new ConcreteSubject();

    //tom訂閱主題

    subject.addObserver(new ConcreteObserver(subject, "tom"));

    //jack訂閱主題

    subject.addObserver(new ConcreteObserver(subject, "jack"));

    //編寫主題內容

    subject.setSubjectState("今天下雨");

    //發布主題,所有訂閱主題的人都收到了

    subject.notifyObserver();

    //編寫主題內容

    subject.setSubjectState("根據最新氣象顯示,今天大部分地區將是雨轉多雲");

    //發布主題,所有訂閱主題的人都收到了

    subject.notifyObserver();

}

我們看結果:

 

tom的收到消息,內容是:今天下雨

jack的收到消息,內容是:今天下雨

tom的收到消息,內容是:根據最新氣象顯示,今天大部分地區將是雨轉多雲

jack的收到消息,內容是:根據最新氣象顯示,今天大部分地區將是雨轉多雲

 

easy吧,完!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM