zoukankan      html  css  js  c++  java
  • 《无间道》观察者模式

    电影无间道很多人都看过,讲的是关于黑社会与警局卧底的故事。
    我们今天就聊一下无间道和面向对象的观察者模式到底有什么关系。

    //被观察者
        public interface Observable
        {
            void notifyEverybody(); //通知所有人
        }
    
        //曾志伟 扮演的 黑社会老大 韩琛
        public class HanLaoda implements Observable {
            ArrayList<Observer> observerList;//卧底们(除了梁朝伟还有很多卧底,比如陈朝伟、张朝伟)
    
            public void notifyEverybody()
            {
                for (Observer item : observerList) {
                    item.reportWangSir();
                }
            }
    
            //韩老大为了扩充势力,只管招小弟进来,但他不知道招进来的是卧底
            public void addObserver(Observer observer)
            {
                observerList.add(observer);
            }
    
            //做违法事情
            public void doWeifa()
            {
                //卧底们一旦发现韩老大要做违法事情,就开始秘密通知警方
                notifyEverybody();
            }
        }
    
        //观察者
        public interface Observer
        {
            //卧底 一旦发现有违法交易,立马做出行动。报告给 黄秋生扮演的 王Sir。
            void reportWangSir();
        }
    
        //梁朝伟 扮演的 梁永仁 是警局安插到黑社会的卧底
        public class LiangChaowei implements Observer
        {
            public void reportWangSir()
            {
                //报告给王Sir
            }
        }
    
        //陈朝伟
        public class ChenChaowei implements Observer
        {
            public void reportWangSir()
            {
                //报告给王Sir
            }
        }
    
        //张朝伟
        public class ZhangChaowei implements Observer
        {
            public void reportWangSir()
            {
                //报告给王Sir
            }
        }
    
        public class Client
        {
            public static void main()
            {
                HanLaoda han = new HanLaoda();
                //韩老大为了扩充势力,只管招小弟进来,但他不知道招进来的是卧底
                han.addObserver(new LiangChaowei());
                han.addObserver(new ChenChaowei());
                han.addObserver(new ZhangChaowei());
    
                //做违法事情
                han.doWeifa();
            }
        }

    那观察者模式在什么情况下使用呢?
    观察者可以实现消息的广播,一个消息可以触发多个事件,这是观察者模式非常重要的功能。

    使用观察者模式也有个重点问题要解决: 
    广播链的问题
    如果你做过数据库的触发器,你就应该知道有一个触发器链的问题,比如表 A 上写了一个触发器,
    内容是一个字段更新后更新表 B 的一条数据,而表 B 上也有个触发器,要更新表 C,表 C 也有触发器…,完蛋了,
    这个数据库基本上就毁掉了!我们的观察者模式也是一样的问题,一个观察者可以有双重身份,即使观察者,
    也是被观察者,这没什么问题呀,但是链一旦建立,这个逻辑就比较复杂,可维护性非常差,根据经验建议,
    在一个观察者模式中多出现一个对象既是观察者也是被观察者,也就是说消息多转发一次(传递两次),这还是比较好控制的。 

  • 相关阅读:
    SpringMvc
    Spring-Aop
    Spring-IOC
    Spring模块划分
    队列
    稀疏数组
    数据结构
    Nginx配置实例
    Nginx常用命令
    视频断点播放:h5+jquery
  • 原文地址:https://www.cnblogs.com/zhuojun/p/5806540.html
Copyright © 2011-2022 走看看