设计模式之观察者模式

Posted 路过你的全世界

tags:

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

什么是观察者模式?

定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖他的对象都会得到通知并被自动更新。

观察者模式用在哪?

观察者模式的典型应用就是在类似的“订阅—发布”系统。我们都用过邮箱,这里以QQ邮箱为例,我们可以在邮箱中进行订阅某个订阅号,之后每次我们就可以收到该订阅号发送过来的资讯信息。在这里我们就相当于观察者,订阅号就是被观察者,被观察者更新了数据,我们观察者就可以看到具体的变化。

观察者模式实现

我们就以上述的“订阅–发布”为例子,具体的展示下观察者模式

  1. 我们先来看下观察者代码

    //Observer 是JDK内置接口,我们可以直接使用
    public class Coder implements Observer 
    private String sName;
    
    public Coder(String name) 
        sName = name;
    
    
    @Override
    public void update(Observable observable, Object data) 
        System.out.println("我的名字是:" + sName + ",内容已经更新:" + data);
    
    
    

    观察者实现Observer接口,并实现update方法。

  2. 接下来实现被观察者代码

    //Observable 属于JDK内置类
    public class DevTechFrontier extends Observable 
    //定义一个方法,提供内容内容更新入口
    public void postNewPublication(String content)
        //标识状态或者内容发生改变
        setChanged();
        //通知所有观察者
        notifyObservers(content);
    
    

    被观察者继承Observable类,之后我们定义一个方法,提供内容更新入口

  3. 调用过程

    public class MainTest 
    public static void main(String[] args) 
        //实例化被观察者对象
        DevTechFrontier devTechFrontier =new DevTechFrontier();
        //创建观察者
        Coder coder1 =new Coder("coder1");
        Coder coder2 =new Coder("coder2");
        Coder coder3 =new Coder("coder3");
        Coder coder4 =new Coder("coder4");
    
        //将观察者注册到可观察对象的观察者列表中
        devTechFrontier.addObserver(coder1);
        devTechFrontier.addObserver(coder2);
        devTechFrontier.addObserver(coder3);
        devTechFrontier.addObserver(coder4);
    
        //更新消息
        devTechFrontier.postNewPublication("我们发布了新内容");
    
    
    
  4. 显示结果(注意打印顺序和注册顺序相反)

    我的名字是:coder4,内容已经更新:我们发布了新内容
    我的名字是:coder3,内容已经更新:我们发布了新内容
    我的名字是:coder2,内容已经更新:我们发布了新内容
    我的名字是:coder1,内容已经更新:我们发布了新内容

观察者模式分析

  • 观察者模式一个重要的功能就是解耦,将观察者和被观察者解耦,使得他们的依赖降低,甚至毫无依赖,增强了系统灵活性,可拓展性。

  • 在应用观察者模式的时候,要考虑下开发效率和运行效率问题,程序包括一个被观察者和若干个观察者,开发调试的工作量较大。

源码补充

详情请看:Observer与Observable源码分析

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

js 之观察者模式

深入理解JavaScript系列(32):设计模式之观察者模式

深入理解JavaScript系列(32):设计模式之观察者模式

设计模式之观察者模式

深入浅出设计模式之策略模式观察者模式

java 之 观察者模式(大话设计模式)