Java设计模式之观察者模式(生产者与消费者模式)

Posted yclau

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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吧,完!

以上是关于Java设计模式之观察者模式(生产者与消费者模式)的主要内容,如果未能解决你的问题,请参考以下文章

ELK之kafka篇

模式发布与订阅模式和观察者模

设计模式之黑板模式

java设计模式之生产者/消费者模式

Java设计模式之生产者/消费者模式

Java设计模式之生产者/消费者模式