zoukankan      html  css  js  c++  java
  • 【Design Patterns】监听器模式

    监听器模式

    监听器模式其实是观察者模式中的一种,两者都有关于回调的设计。

    与观察者模式不同的是,观察者模式中存在的角色为观察者(Observer)被观察者(Observable)

    而监听器模式中存在三种角色

    • 事件源(EventSource)
    • 事件对象(EventObject)
    • 事件监听器(EventListener)

    简单的概述就是: 事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法

    下面这张图可以很详细解释他们之间的关系

    简单的实例

    UML

    @startuml
    class EventSource{
    - listeners: Vector<EventListener>
    + void addListener(EventListener listener)
    + void removeListener(EventListener listener)
    + void notifyListenerEvents(EventObject eventObject)
    }
    
    class EventObject{
    + getSource(): Object
    + void:say()
    
    }
    
    interface EventListener{
    + void handleEvent(EventObject eventObject)
    }
    
    class ConcreteEvetListenerA{
    + void handleEvent(EventObject eventObject)
    }
    class ConcreteEvetListenerB{
    + void handleEvent(EventObject eventObject)
    }
    
    EventListener <-- ConcreteEvetListenerA
    EventListener <-- ConcreteEvetListenerB
    
    
    EventObject --o EventListener
    
    EventSource -- EventObject
    @enduml
    

    事件源

    public class DemoEventSource {
    
        /** 监听器列表 */
        public Vector<DemoEventListener> listeners = new Vector<>();
    
        /**
         * 注册监听器
         * @param listener EventListener
         */
        public void addListener(DemoEventListener listener) {
            listeners.add(listener);
        }
    
        /**
         * 撤销监听器
         * @param listener EventListener
         */
        public void removeListener(DemoEventListener listener) {
            listeners.remove(listener);
        }
    
    
        /**
         * 通知所有监听器,包裹事件源成为事件
         * @param eventObject EventObject
         */
        public void notifyListenerEvents(EventObject eventObject){
            listeners.forEach(listener ->{
                listener.handleEvent(eventObject);
            });
        }
    }
    

    事件对象

    public class DemoEventObject extends EventObject {
    
        /**
         * Constructs a prototypical Event.
         *
         * @param source The object on which the Event initially occurred.
         * @throws IllegalArgumentException if source is null.
         */
        public DemoEventObject(Object source) {
            super(source);
        }
    
    
        /**
         * 事件的回调或者业务逻辑
         */
        public void say() {
            System.out.println("this is " + this + " to say");
        }
    }
    

    事件监听器

    public interface DemoEventListener extends EventListener {
    
        /**
         * 处理事件
         * @param eventObject EventObject
         */
        void handleEvent(EventObject eventObject);
    }
    
    public class ConcreteEventListenerA implements DemoEventListener {
    
        @Override
        public void handleEvent(EventObject eventObject) {
            System.out.println("ConcreteEventListenerA accept eventObject , eventSource is : " + eventObject.getSource());
            if (eventObject instanceof DemoEventObject) {
                // 执行事件的回调函数/具体业务逻辑
                ((DemoEventObject) eventObject).say();
            }
        }
    }
    
    public class ConcreteEventListenerB implements DemoEventListener {
    
        @Override
        public void handleEvent(EventObject eventObject) {
            System.out.println("ConcreteEventListenerB accept eventObject , eventSource is : " + eventObject.getSource());
    
            if (eventObject instanceof DemoEventObject) {
                // 执行事件的回调函数/具体业务逻辑
                ((DemoEventObject) eventObject).say();
            }
    
        }
    }
    

    客户端

    public class Client {
        public static void main(String[] args) {
    
            // 初始化监听器
            DemoEventListener demoEventListenerA = new ConcreteEventListenerA();
            DemoEventListener demoEventListenerB = new ConcreteEventListenerB();
    
            // 事件源A
            DemoEventSource demoEventSource1 = new DemoEventSource();
            demoEventSource1.addListener(demoEventListenerA);
            demoEventSource1.addListener(demoEventListenerB);
            demoEventSource1.notifyListenerEvents(new DemoEventObject(demoEventSource1));
    
            // 事件源B
            DemoEventSource demoEventSource2 = new DemoEventSource();
            demoEventSource2.addListener(demoEventListenerB);
            demoEventSource2.notifyListenerEvents(new DemoEventObject(demoEventSource2));
        }
    }
    
  • 相关阅读:
    VMWare Workstation的激活码 亲测有效
    虚拟机搭建appRtcDemo的appr.tc服务器
    windows webrtc支持H264的源码编译
    windows webrtc 编译
    获取windows系统分屏个数
    windows cmd窗口光标闪动效果消失
    win10 检测系统是不是正版的 以及slmgr.vbm -dlv命令不生效
    symfonos2
    利用ARP欺骗进行MITM(中间人攻击)
    内网学习之MySQL服务提权
  • 原文地址:https://www.cnblogs.com/xcmelody/p/11048570.html
Copyright © 2011-2022 走看看