观察者模式

Posted tanoak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

  • 概述
  • UML类图
  • 代码栗子
  • 总结

概念

  • 概念 观察者模式又叫做发布-订阅模式,观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新(来源百度百科)。栗如,抗日战争中我方地下党人会密切监视日军的一举一动,根据它们的战略部署及时做出相应的返回,这也就是观察者模式(我军->观察者;日军->被观察者)
  • 作用
    1. 观察者和被观察者之间是抽象耦合
    2. 建立一套触发机制(触发链);栗如(我方地下党观察到日军要进行扫荡,返回基地向班长汇报,班长一级向上汇报最终首长发出应对的方针)

UML 类图

技术图片

代码栗子

  • 观察者

    注意这里的接口 Observer ,这是观察要实现的接口,JDK 原生提供了 观察者接口的定义,这里就直接使用JDK自带的

    public class ClassLeader implements Observer {
        /**
         * 班干部观察学生的上课纪律情况
         *
         * @param observable
         * @param obj
         */
        @Override
        public void update(Observable observable, Object obj) {
            System.out.println("班干部:观察到"+obj.toString()+",开始向老师汇报了...");
            this.reportToTeacher(obj.toString());
            System.out.println("班干部:报告完毕...");
        }
    
        /**
         * 报告给老师
         *
         * @param reportContext
         */
        private void reportToTeacher(String reportContext) {
            System.out.println("班干部:报告老师!" + reportContext);
        }
    }
  • 被观察者

    Observable 接口也是使用JDK的原生定义的

    public interface IStudent {
    
        /**
         * 学生名字
         * @return
         */
        String getName() ;
        /**
         * 吃零食
         */
        void eatFood();
    
        /**
         * 上课聊天
         */
        void chat();
    }
    public class ZhangSan extends Observable implements IStudent {
        /**
         * 学生名称
         *
         * @return
         */
        @Override
        public String getName() {
            return "张三";
        }
    
        @Override
        public void eatFood() {
            System.out.println(this.getName()+":上课吃零食...");
            /**
             * 通知所有的观察者
             */
            super.setChanged();
            super.notifyObservers(this.getName()+"上课吃零食");
        }
    
    
        @Override
        public void chat() {
            System.out.println(this.getName()+":上课聊天、玩QQ...");
            super.setChanged();
            this.notifyObservers(this.getName()+"上课聊天、玩QQ");
        }
    }
  • test

    public class Main {
        public static void main(String[] args) {
            //班干部
            Observer classLadeLr = new ClassLeader();
            ZhangSan zhangSan = new ZhangSan();
            zhangSan.addObserver(classLadeLr);
            zhangSan.chat();
            zhangSan.eatFood();
        }
    }
  • 运行效果

技术图片

总结

  • 观察者模式的应用极其广泛,但是要注意它的观察链(触发链),栗子 A观察B ,触发C; C观察D ,触发E;E观察F ,触发A; 这样一条触发链后期维护的成本很大

参考资料

书籍《设计模式之禅》

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式