zoukankan      html  css  js  c++  java
  • 观察者模式【行为模式】

    观察者模式

    Define a one-to-many dependency between objects so that when one object change state,
    all its dependents are notified and updated automatically.
    定义对象间一种一对多的依赖关系,这样,当一的一方状态改变时,所有它的依赖者都会被自动通知。
    
    public class Observer {
        /**
         * 观察者模式:
         * Define a one-to-many dependency between objects so that when one object change state,
         * all its dependents are notified and updated automatically.
         * 定义对象间一种一对多的依赖关系,这样,当一的一方状态改变时,所有它的依赖者都会被自动通知。
         */
        @Test
        public void all() {
            final Student student = Student.builder().name("二狗子").build();
            final Monitor monitor = Monitor.builder().name("monitor").build();
            final Teacher teacher = Teacher.builder().name("teacher").build();
    
            student.addObserver(monitor);
            student.addObserver(teacher);
    
            student.play();
        }
    }
    
    /**
     * 1)观察者需要观察的事件或行为
     */
    interface IObserver {
        void inform(String event);
    }
    
    /**
     * 2)被观察者对观察者的操作接口
     */
    interface IObserverOperate {
        void addObserver(IObserver observer);
    
        void removeObserver(IObserver observer);
    
        void notifyAll(String target);
    }
    
    /**
     * 3)具体的观察者实现
     */
    @Builder
    @Slf4j
    class Monitor implements IObserver {
        private final String name;
    
        @Override
        public void inform(String event) {
            log.info("{} {}", name, event);
        }
    }
    
    /**
     * 4)具体的观察者实现
     */
    @Builder
    @Slf4j
    class Teacher implements IObserver {
        private final String name;
    
        @Override
        public void inform(String event) {
            log.info("{} {}", name, event);
        }
    }
    
    /**
     * 4)具体的被观察者实现,实现了观察者管理接口
     */
    @Builder
    class Student implements IObserverOperate {
        private final String name;
        @Default
        private final List<IObserver> observers = Lists.newArrayList();
    
        @Override
        public void addObserver(IObserver observer) {
            observers.add(observer);
        }
    
        @Override
        public void removeObserver(IObserver observer) {
            observers.remove(observer);
        }
    
        @Override
        public void notifyAll(String target) {
            observers.forEach(observer -> observer.inform(target));
        }
    
        public void play() {
            /**
             * 一旦主体状态变化,立即通知所有的观察者
             */
            final String event = name + " is plaing";
            notifyAll(event);
        }
    }
    
  • 相关阅读:
    EF6 AddOrUpdate之后,数据没有改变而是新增了一条数据解决办法
    php多文件上传数组 转换
    windows svn 上传后 自动部署 到web目录下
    一组实用网址
    apache 虚拟ip
    ThinkPHP 空方法 显示
    thinkphp 创建子应用
    Zend Studio 9.0.4 新建项目
    鼠标悬浮停留三秒 显示大图
    mysql GROUP BY 与 ORDER BY 查询不是最新记录
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10164735.html
Copyright © 2011-2022 走看看