基本介绍
观察者模式属于行为型设计模式的一种。该模式的主要作用是定义了对象之间一对多的依赖关系。当“一”的一方发生改变时会自动通知给每一位依赖者。
简单来说我们可以将该模式理解成一个社区的“居委会”,每位居民都依赖于居委会,当有什么消息时居委会将通知给每位居民。
相信通过这个简单的小例子我们可以看出,观察者模式是站在易用和低耦合的前提下,保证所有依赖者可以收到被依赖一方的改变。
UML类图讲解
类图讲解
Subject:抽象主题(抽象被观察者),可以对比上文理解成抽象的居委会。接口中定义了新增、删除观察者和通知消息给所有观察者的方法。
ConcreteSubject:具体主题(被观察者),也就是具体的居委会。该类实现了抽象主题,并且还聚合了所有观察者。
Observer:抽象观察者,可以对比上文理解为抽象的居民。接口中定义了一个更新方法,该方法用于在接收到主题的通知后进行更新。
ConcreteObserverA/B:具体的观察者。该类实现了抽象观察者,并具体实现了其中定义的方法。
Client:客户端测试类。
案例讲解
案例:居委会发送消息给每位居民。
观察者接口
public interface Observer {
// 更新消息
void update(String msg);
}
居民相关类 =>具体观察者
/**
* 居民A
*/
public class InhabitantA implements Observer {
// 消息
private String msg;
@Override
public void update(String msg) {
this.msg = msg;
System.out.println("居民A收到的最新消息:" + this.msg);
}
}
/**
* 居民B
*/
public class InhabitantB implements Observer {
// 消息
private String msg;
@Override
public void update(String msg) {
this.msg = msg;
System.out.println("居民B收到的最新消息:" + this.msg);
}
}
主题接口
public interface Subject {
// 注册观察者
void registerObserver(Observer observer);
// 删除观察者
void removerObserver(Observer observer);
// 通知所有观察者
void notifyObservers();
}
居委会 => 对应具体主题角色
public class NeighborhoodCommittee implements Subject {
// 消息
private String msg;
// 观察者集合
private List<Observer> observers;
public NeighborhoodCommittee() {
this.observers = new ArrayList<>();
}
// 更新消息
public void updateMsg(String msg) {
this.msg = msg;
this.notifyObservers();
}
@Override
public void registerObserver(Observer observer) {
this.observers.add(observer);
}
@Override
public void removerObserver(Observer observer) {
if (this.observers.contains(observer)) {
this.observers.remove(observer);
}
}
@Override
public void notifyObservers() {
for (Observer observer : this.observers) {
observer.update(this.msg);
}
}
}
客户端
public class Client {
public static void main(String[] args) {
// 创建居委会
NeighborhoodCommittee nc = new NeighborhoodCommittee();
// 创建居民
InhabitantA inhabitantA = new InhabitantA();
InhabitantB inhabitantB = new InhabitantB();
// 注册用户
nc.registerObserver(inhabitantA);
nc.registerObserver(inhabitantB);
// 更新消息
nc.updateMsg("点赞、关注小菜鸟!");
}
}
执行结果
总结
1、观察者模式将主题和观察者之间的依赖提升到抽象层。
2、观察者模式在主题中通过集合管理所有观察者,并提供注册和删除的方法。当新增或删除观察者时就不需要修改原有的代码,只要调用相应的方法即可。这样的模式符合ocp原则。
3、观察者模式将观察者和被观察者(主题)进行了分离,从而提高了程序的可维护性和重用性。
4、如果一个主题有很多观察者,那么将更新的内容通知给所有观察者时将花费很多时间。
5、观察者和主题之间如果存在循环依赖的话会造成系统崩溃。
6、主题更新内容进行通知时尽量采用异步方法,避免同步更新时因某一观察者出错而导致整个通知中断。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。