设计模式之观察者模式
Posted ProChick
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之观察者模式相关的知识,希望对你有一定的参考价值。
1.简要概述
- 观察者模式定义了对象之间的一对多关系,也就是说当一个对象的状态发生变化时,会告知其它的依赖对象也做相应的状态更新。
- 观察者模式中,发送状态变化通知的对象称之为目标对象(Subject),接收并响应状态变化的对象称之为观察者对象(Observer)。
2.模式结构
👉通常由一个主题接口(
负责定义管理、维护、通知观察者的一系列方法接口
),多个具体的主题类(负责实现对于观察者的注册、移除、通知等功能的内部逻辑
),一个观察者接口(负责定义接收通知并更新的方法接口
),多个具体的观察者类(负责为不同的观察者实现不同的更新内部逻辑
),一个客户类(负责对主题类和观察者类进行调用
)共同组成。
3.实现代码
举例 💡 :假设现在有一个新闻网站可供用户订阅,当网站发布新的新闻时,则会通知每个订阅者进行了更新。那么这个过程我们就可以使用观察者模式来进行处理。
发布者接口
public interface Publish {
void register(Observer observer);
void remove(Observer observer);
void notify();
}
新闻发布者
public class NewsPublish implements Publish {
private String news;
private List<Observer> observers;
public NewsPublish() {
observers = new ArrayList<>();
}
public void setNews(String content) {
this.news = content;
}
@Override
public void register(Observer observer) {
observers.add(observer);
}
@Override
public void remove(Observer observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
@Override
public void notify() {
for (Observer observer : observers) {
observer.update(news);
}
}
}
观察者接口
public interface Observer {
void update(String content);
}
观察者
public class UserObserver implements Observer {
@Override
public void update(String content) {
System.out.println("新闻更新: " + content);
}
}
客户类
// 测试客户端
public class ObserverClient{
public static void main(String[] args) {
// 创建观察者
Observer o1 = new UserObserver();
Observer o2 = new UserObserver();
// 创建发布者
Publish publish = new NewsPublish();
publish.add(o1);
publish.add(o2);
// 更新内容并通知观察者
publish.setNews("新的新闻");
publish.notify();
}
}
4.优点好处
- 观察者模式在被观察者和观察者之间建立一个抽象的耦合, 由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
- 在观察者模式中,我们可以随意的添加和移除指定的观察者,而不需要对发布者进行内部逻辑的更改,所以符合OCP原则。
5.缺点弊端
- 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
- 如果在被观察者之间有循环依赖的话,被观察者在执行时很有可能发生循环调用,导致系统崩溃。
6.应用场景
- 当我们想要在系统中实现类似于广播机制功能的时候使用。
- 当对一个对象状态进行更新,需要其它有所关联的对象也同步进行更新,而且其它对象的数量可以动态改变的时候使用。
- 当一个对象仅需要将自己的更新通知给其它对象,而不需要让其它对象知道内部细节的时候使用。
7.应用示例
JDK源码中的Observable类
-
这里的Observable类就相当于观察者模式中的主题类,只不过这里没有实现任何接口,直接进行的实现。
-
我们看到在Observable类中同样定义了添加观察者、移除观察者、通知观察者的一系列方法。
-
这里的Observer类就是观察者接口,里面定义了通知更新的update方法。
-
所以从上面的过程分析可以看出,JDK中的Observable类的设计就是使用的观察者模式。
以上是关于设计模式之观察者模式的主要内容,如果未能解决你的问题,请参考以下文章