美文网首页设计模式
设计模式20:观察者模式(Observer)

设计模式20:观察者模式(Observer)

作者: ygxing | 来源:发表于2019-04-23 18:07 被阅读0次

    1. 简介

    - 观察者模式,又被成为发布订阅模式,
    - 当一个对象的状态发生改变之后,会主动通知所有观察者,
    - 然后每个观察者执行自己相应的函数
    
    1.1 优点
    - 被观察的对象和观察者之间解耦,方便扩展
    - 观察者之间相互解耦,只是实现了共同接口
    
    1.2 缺点
    - 在单线程环境中,观察者收到通知的时间会比较长
    
    1.3 使用场景
    - 事件驱动模式:
        按钮点击,页面刷新等等
    - 广播模式:
        系统启动时,通知各个组件
    

    2.实现代码

    这里使用了观察者模式的一个扩展模式,
    也就是事件监听器模式来实现
    
    2.1 具体逻辑
    领导和老板都希望员工能好好工作,
    就找人监听员工yanggx的工作状态,
    当yanggx工作状态改变的时候,
    监听者就会将事件汇报领导和老板,
    这里就涉及到四个组成部分:事件源,事件,监听器和事件发布器
    
    2.1.1事件源
    yanggx这个人,对应的类是Yanggx
    
    /**
     * 事件源,也就是被监听的对象,
     * 这里是yanggx这个人
     */
    public class Yanggx {
        private String state;
        public String getState() {
            return state;
        }
        public void setState(String state) {
            this.state = state;
        }
    }
    
    2.1.2事件
    - yanggx所发生的事件,对应抽象类YanggxEvent
    - 我们主要监听工作事件,所以只有一个实现类YanggxWorkEvent
    
    /**
     * yanggx事件
     */
    public abstract class YanggxEvent extends EventObject {
        private static final long serialVersionUID = -1336288592330402915L;
        public YanggxEvent(Object source) {
            super(source);
        }
    }
    /**
     * 工作事件
     */
    public class YanggxWorkEvent extends YanggxEvent {
    
        private static final long serialVersionUID = -4366933029591990461L;
    
        public YanggxWorkEvent(Yanggx yanggx) {
            super(yanggx);
        }
    }
    
    2.1.3 监听器
    - 就是对yanggx工作感兴趣的人,对应接口YanggxListener
    - 对yanggx工作感兴趣的有大Boss,对应实现类YanggxBossListener,
    - 还有上级领导也感兴趣,对应实现类YanggxLeaderListener
    
    /**
     * yanggx事件的监听器
     */
    public interface YanggxListener<E extends YanggxEvent> extends EventListener {
        /**
         * 监听到事件之后,触发的动作
         * @param event
         */
        void onYanggxEvent(E event);
    }
    
    /**
     * yanggx的老板监听器
     */
    public class YanggxBossListener implements YanggxListener<YanggxEvent> {
    
        @Override
        public void onYanggxEvent(YanggxEvent event) {
            Yanggx yanggx = (Yanggx) event.getSource();
            System.out.println("Boss:我不认识他,所以不做任何处理");
        }
    }
    
    /**
     * yanggx的领导监听器
     */
    public class YanggxLeaderListener implements YanggxListener<YanggxEvent> {
    
        @Override
        public void onYanggxEvent(YanggxEvent event) {
            Yanggx yanggx = (Yanggx) event.getSource();
            System.out.print("Leader:上班时间" + yanggx.getState() + "赶紧起来干活");
        }
    }
    
    2.1.4事件发布器
    就是将工作事件汇报给上级领导的人,对应的类是YanggxEventPublisher
    
    /**
     * 事件发布器
     */
    public class YanggxEventPublisher {
    
        List<YanggxListener<YanggxEvent>> listeners = new ArrayList<>();
    
        /**
         * 注册监听器
         * 
         * @param listener
         */
        public void registListener(YanggxListener<YanggxEvent> listener) {
            listeners.add(listener);
        }
    
        /**
         * 发布事件
         * 
         * @param event
         */
        public void publishEvent(YanggxEvent event) {
            System.out.println("发布Yanggx事件开始...");
            for (YanggxListener<YanggxEvent> listener : listeners) {
                listener.onYanggxEvent(event);
            }
        }
    }
    
    2.2 类图
    观察者模式
    2.3 代码测试
    //测试类
    public class ObserverTest {
        public static void main(String[] args) {
            // 事件源:yanggx
            Yanggx yanggx = new Yanggx();
            yanggx.setState("睡觉...");
            // 事件
            YanggxEvent event = new YanggxWorkEvent(yanggx);
            // 在事件发布者中注册监听器
            YanggxEventPublisher publisher = new YanggxEventPublisher();
            publisher.registListener(new YanggxBossListener());
            publisher.registListener(new YanggxLeaderListener());
            // 发布事件
            publisher.publishEvent(event);
        }
    }
    
    运行结果:
        发布Yanggx事件开始...
        Boss:我不认识他,所以不做任何处理
        Leader:上班时间睡觉...赶紧起来干活
    

    相关文章

      网友评论

        本文标题:设计模式20:观察者模式(Observer)

        本文链接:https://www.haomeiwen.com/subject/qssbgqtx.html