细说观察者模式

110 阅读3分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。

前言

大家好,我是程序猿小白 gw_Gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要介绍观察者模式的思想和具体实现。

观察者模式

举例

有一家报社在当地非常的受欢迎,有很多人都在他家订阅报纸,而每当报纸更新之后,这家报社派人挨个通知订阅过此更新的报纸的人,以便他们能及时即使接收到消息,更新自己的知识库。这家报社的服务可谓是非常贴心了,生意也越来越好。

观察者模式概念

通过以上的栗子我相信你对观察者模式已经有了了解,观察者模式就是为了解决上诉一对多的依赖关系的问题而产生的,当目标对象(报纸)发生改变时,所有依赖于目标对象的观察者对象就会被通知并自动更新(订阅报纸的人)。观察者模式属于行为型模式

观察者模式优缺点

优点:

  1. 观察者和被观察者的耦合程度不高,属于抽象耦合。
  2. 观察者与目标之间建立了一套触发机制。

缺点:

  1. 有可能出现循环引用,导致系统崩溃。
  2. 如果观察者过多,则可能花费较长时间。(这点可以使用异步来解决。)
  3. 不了解过程,只知道结果。不知道目标是如何变化的,仅仅知道目标发生了变化。

观察者模式设计实现

  1. 抽象目标对象。设置抽象类来表示抽象目标,提供保存观察者对象的集合和添加观察者,删除观察者以及通知所有观察者的方法。
  2. 具体目标对象。实现基类中通知观察者的方法。
  3. 抽象观察者。提供被通知时的自我更新方法。
  4. 具体观察者。实现基类中自我更新的方法。

观察者模式代码实现

抽象目标类

public abstract class AbstractSubject {
    protected List<AbstractObserver> observers = new ArrayList();
    public void registerObserver(AbstractObserver observer){
        observers.add(observer);
    }
    public void delObserver(AbstractObserver observer){
        observers.remove(observer);
    }

    /**
     * 通知所有的观察者
     */
    public abstract void notifyAllObservers();
}

具体目标类

public class SubjectOne extends AbstractSubject {
    @Override
    public void notifyAllObservers() {
        for(AbstractObserver obs:observers){
            obs.update();
        }
    }
}

抽象观察者

public abstract class AbstractObserver {
    /**
     * 收到通知后自动更新
     */
    public abstract void update();
}

具体观察者

public class ObserverOne extends AbstractObserver {
    @Override
    public void update() {
        System.out.println("我收到了通知");
    }
}

测试类

public class Client {
    public static void main(String[] args) {
        SubjectOne subjectOne = new SubjectOne();
        ObserverOne observerOne = new ObserverOne();
        subjectOne.registerObserver(observerOne);
        subjectOne.notifyAllObservers();
    }
}

具体流程:将所有观察者存放到观察者队列中,当目标发生改变时,通知所有的观察者,使其自动更新。

小结

以上就是关于观察者模式的一些介绍,希望对读者有所帮助,如有不正之处,欢迎留言指正。