zoukankan      html  css  js  c++  java
  • 观察者模式

    老板约谈

      大家好,我叫小赵,目前在藏剑山庄任职高级铸剑师,我们的铸剑团队分为17个小组,高级铸剑师就是其中的小组长,小组长的主要工作就是管理小组的项目进度,并且处理一些剑农无法解决的技术问题。

      记得有一次,我们一伙七八个小组长闲得蛋疼,围在一起唠嗑,唠着唠着不知道是谁从裤兜里掏了一副扑克牌出来,大伙沉默了一分钟,经过小声的交流确认之后,瞬间撸起袖子直接开干!

      打牌的代码以省略号代替.......

    只见控制台不断的输出信息:

    老王:三带一。
    老李:炸!报单!
    老王:我炸!报单!
    老李:王炸!
    老王:我草!
    ......

      三天后,老王被老板约谈。原因是那天老板来车间巡视,听到老王大叫一声 "草泥马!"。

    通风报信的秘书

      后来,老王去买通了老板身边的秘书,那个秘书在我印象中是个十足十的冰山美人,没想到老王确实有一套。

      从此以后,只要老板要来车间,秘书就悄悄打个电话过来报信。

    类图:

    观察者抽象:

    public interface IObserver {
        void update(String str);//行动
    }

    秘书:

    public class Secretary implements IObserver {
        @Override
        public void update(String str) {
            System.out.println("秘书:老王!"+str);
        }
    }

    被观察者抽象:

    public interface IBoss {
        void coming();//老板来了
    }

    老板:

    public class Boss implements IBoss {
        //老板身边的秘书
        IObserver observer = new Secretary();
        @Override
        public void coming() {
            System.out.println("老板走到门口...");
            observer.update("老板来了!");
        }
    }

    主函数:

        public static void main(String[] args) {
            Boss boss = new Boss();
            boss.coming();
        }

    输出:

    老板走到门口...
    秘书:老王!老板来了!

    多一个眼线,多一份平安

      不久后,老王又被老板叫去办公室喝茶了,原因是有几天秘书身体不适没上班,以至于老王的真面目又一次被老板看到了,场面一度尴尬。

      老王平安回来之后,大伙开了个紧急会议,为了避免万无一失,一名观察者是不够的!

      老李去搞定人事部小美,老刘去搞定公司前台小玲。

    大伙商定之后,我迅速开始做设计,画下类图:

    观察者抽象:

    public interface IObserver {
        void update(String str);//行动
    }

    秘书:

    public class Secretary implements IObserver {
        @Override
        public void update(String str) {
            System.out.println("秘书:老王!"+str);
        }
    }

    小美:

    public class XiaoMei implements IObserver {
        @Override
        public void update(String str) {
            System.out.println("小美:老李!"+str);
        }
    }

    小玲:

    public class XiaoLing implements IObserver {
        @Override
        public void update(String str) {
            System.out.println("小玲:老刘!"+str);
        }
    }

    老板行为抽象:

    public interface IBoss {
        void coming();//老板来了
    }

    被观察者的管理抽象:

    public interface IObservable {
        void add(IObserver observer);//增加观察者
        void delete(IObserver observer);//删除观察者
        void notifyObservers(String message);//通知观察者
    }

    老板:

    public class Boss implements IBoss,IObservable {
        //老板身边的观察者
        private ArrayList<IObserver> observers = new ArrayList<>();
    
        @Override
        public void coming() {
            System.out.println("老板走到门口...");
            this.notifyObservers("老板来了!");
        }
    
        @Override
        public void add(IObserver observer) {
            this.observers.add(observer);//增加一个观察者
        }
    
        @Override
        public void delete(IObserver observer) {
            this.observers.remove(observer);//删除一个观察者
        }
    
        @Override
        public void notifyObservers(String message) {
            for(IObserver observer : this.observers){
                observer.update(message);//给观察者发信息
            }
        }
    }

    主函数:

        public static void main(String[] args) {
            //三个观察者
            IObserver secretary = new Secretary();
            IObserver xiaoMei = new XiaoMei();
            IObserver xiaoLing = new XiaoLing();
    
            //老板
            Boss boss = new Boss();
    
            //三个观察者在观察老板
            boss.add(secretary);
            boss.add(xiaoMei);
            boss.add(xiaoLing);
    
            //老板来了
            boss.coming();
        }

    输出:

    老板走到门口...
    秘书:老王!老板来了!
    小美:老李!老板来了!
    小玲:老刘!老板来了!

    观察者模式

      观察者模式又叫发布订阅模式。

      观察者定义了一种一对多的依赖关系,多个观察者同时监听一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象。

      使用场景:当一个对象的改变需要同时改变其他对象的时候,优先考虑观察者模式。

  • 相关阅读:
    SpringMVC案例3----spring3.0项目拦截器、ajax、文件上传应用
    TCP/IP、UDP、 Http、Socket的差别
    HttpClient 图讲解明
    数据库设计--数据的垂直拆分
    未经处理的异常在 System.Data.dll 中发生。其它信息:在应使用条件的上下文(在 &#39;***&#39; 附近)中指定了非布尔类型的表达式。
    VMware 下扩展linux硬盘空间
    cocos2d_android 第一个游戏
    解决安卓程序安装没图标的问题
    Qt编译错误GL/gl.h: No such file or directory
    【编程题目】二元树的深度
  • 原文地址:https://www.cnblogs.com/fengyumeng/p/10773605.html
Copyright © 2011-2022 走看看