• 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吧,完!

  • 相关阅读:
    Python——GUI编程 控件及常用信号
    Python——PYQT:控件基本使用
    Android 自己定义圆圈进度并显示百分比例控件(纯代码实现)
    Parallel and Perpendicular
    策略模式(Strategy Pattern)
    Linux Framebuffer驱动剖析之中的一个—软件需求
    Java知识总结---整合SpringMVC+Mybatis+Spring(二)
    wav音频文件头解析
    【EasyUi DataGrid】批量删除
    Spark SQL Catalyst源代码分析之UDF
  • 原文地址:https://www.cnblogs.com/yclau/p/12454612.html
Copyright © 2020-2023  润新知