码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-03-10 11:50:05      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:子类   over   return   通知   set   订阅   name   str   print   

 

生活中我们经常遇到观察者模式的案例。

例如,我们去商场购物,注册了一家店的会员,一旦这家店有活动,你的手机就会收到一些推送消息,是不是?

在例如,我们看某个电视台的节目,这个电视台放什么节目我们就会看到什么节目。

这些都是典型的生产者与消费者的案例。

所谓的观察者模式,定义了一种一对多的依赖关系,能够让多个观察者订阅某个主题,当这个主题发生变化的时候,主题会通知这些订阅者,那么观察者就会自动更新变化。

我们以天气预告为例,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设计模式之观察者模式(生产者与消费者模式)

标签:子类   over   return   通知   set   订阅   name   str   print   

原文地址:https://www.cnblogs.com/yclau/p/12454612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!