• 设计模式(第十九式:观察者模式)


    概念:
      观察者模式:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notifued and updated automatically. 定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,其他所有依赖它的对象都会得通知并被自动更新。

    实现:
      定义观察者接口

        public interface Observer {
    
            void clicked(Clieckable clieckable);
            
        }


      定义被观察者接口

        public interface Clieckable {
            void click();
    
            void addObserver(Observer observer);
    
            void delObserver(Observer observer);
        }


      观察者具体实现

        public class ButtonObserver implements Observer {
            @Override
            public void clicked(Clieckable clieckable) {
                System.out.println("作为一个观察者,我当然看到按钮被点了。");
            }
        }


      被观察者具体实现

        public class Button implements Clieckable {
            List<Observer> list = new ArrayList<>();
    
            @Override
            public void click() {
                System.out.println("按钮被点击了");
                list.forEach(item->{
                    item.clicked(this);
                });
            }
    
            @Override
            public void addObserver(Observer observer) {
                list.add(observer);
            }
    
            @Override
            public void delObserver(Observer observer) {
                list.remove(observer);
            }
        }


    测试及结果:

        @Test
        public void observerTest(){
            Button button = new Button();
            button.addObserver(new ButtonObserver());
            button.click();
        }


        按钮被点击了
        作为一个观察者,我当然看到按钮被点了。

    分析:
      1.在抽象出接口或者抽象类后扩展都变得非常方便。
      2.广播式通信,被观察者可以添加多个观察者对象,在相同的观察主题下,支持一对多的通知模式。
      3.在单线程下,如果有多个观察者,可能对于通知观察者需要的时间更长一下,在for循环中处于串联式通知;必要的时候可以考虑多线程异步通知。
      4.观察者模式属于处于单项通知,有些类似于偷拍的感觉,观察者可以实时知道被观察者的状态,但是被观察者并不能得知自己处于一个被观察的状态。
      5.适用场景:
        a.一组被同意事物控制的行为。比如跑步的信号枪。

        b.事件多级出发。比如公司的款项报销审批流程。c.跨系统的消息队列处理。

        ...

  • 相关阅读:
    php学习笔记
    附加题-重构的读后总结
    附加题-stack的理解
    (转)php的扩展和嵌入--php的生命周期与变量详述
    homework-09
    html学习笔记之position
    homework-06
    homework-08
    在windows下使用git需要反复输入用户名和密码的问题
    windows命令行编码与nodejs编码格式冲突的解决方式
  • 原文地址:https://www.cnblogs.com/ben-mario/p/11133856.html
Copyright © 2020-2023  润新知