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.跨系统的消息队列处理。

        ...

  • 相关阅读:
    横竖屏
    iOS/Android·全球
    POKEMON GO(口袋妖怪)一起玩
    自定义宏
    设置button图片和文字
    iOS10 降级版本到9.几
    1.安装Loucust
    python小程序打包
    Jmeter GIS调用-->参数化+正则表达式提取器+后置处理器+逻辑控制器
    装PIL库
  • 原文地址:https://www.cnblogs.com/ben-mario/p/11133856.html
Copyright © 2011-2022 走看看