「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
前言
大家好,我是程序猿小白 gw_Gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍观察者模式的思想和具体实现。
观察者模式
举例
有一家报社在当地非常的受欢迎,有很多人都在他家订阅报纸,而每当报纸更新之后,这家报社派人挨个通知订阅过此更新的报纸的人,以便他们能及时即使接收到消息,更新自己的知识库。这家报社的服务可谓是非常贴心了,生意也越来越好。
观察者模式概念
通过以上的栗子我相信你对观察者模式已经有了了解,观察者模式就是为了解决上诉一对多的依赖关系
的问题而产生的,当目标对象(报纸)发生改变时,所有依赖于目标对象的观察者对象就会被通知并自动更新(订阅报纸的人)。观察者模式属于行为型模式
。
观察者模式优缺点
优点:
- 观察者和被观察者的耦合程度不高,属于抽象耦合。
- 观察者与目标之间建立了一套触发机制。
缺点:
- 有可能出现循环引用,导致系统崩溃。
- 如果观察者过多,则可能花费较长时间。(这点可以使用异步来解决。)
- 不了解过程,只知道结果。不知道目标是如何变化的,仅仅知道目标发生了变化。
观察者模式设计实现
- 抽象目标对象。设置抽象类来表示抽象目标,提供保存观察者对象的集合和添加观察者,删除观察者以及通知所有观察者的方法。
- 具体目标对象。实现基类中通知观察者的方法。
- 抽象观察者。提供被通知时的自我更新方法。
- 具体观察者。实现基类中自我更新的方法。
观察者模式代码实现
抽象目标类
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();
}
}
具体流程:将所有观察者存放到观察者队列中,当目标发生改变时,通知所有的观察者,使其自动更新。
小结
以上就是关于观察者模式的一些介绍,希望对读者有所帮助,如有不正之处,欢迎留言指正。