• 观察者模式【行为模式】


    观察者模式

    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);
        }
    }
    
  • 相关阅读:
    当blogger遭遇bXbm42e8
    按时间顺序来,对我影响较大的格言应当首推在高中毕业时霄美人送我的那一句话,它指引着我如何去面对很多难...
    遇见一孙子
    回草儿:呵呵~~这个……随缘。
    学Linux下的编程,make非学好不可啊……
    呵呵,你的口才不错啊!军师,我发现你挺会说话。
    字符串处理的一个简单题
    以Python为基础的REST(JSON为交换数据)接口的测试框架设计(一)
    人生的战略总结最近三年选择的得失
    淘宝开放API初探
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10164735.html
Copyright © 2020-2023  润新知