zoukankan      html  css  js  c++  java
  • 设计模式(第十九式:观察者模式)

    概念:
      观察者模式: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.跨系统的消息队列处理。

        ...

  • 相关阅读:
    [辛酸历程]在Mac中使用Python获取屏幕截图
    一个简单的验证码识别教程
    JavaScript的函数作用域
    函数声明和函数表达式
    数组 方法和属性
    递归
    闭包
    浏览器解析JavaScript原理
    JavaScript的数据类型2
    利用canvas画一个动态时钟
  • 原文地址:https://www.cnblogs.com/ben-mario/p/11133856.html
Copyright © 2011-2022 走看看