观察者模式定义
观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/Subscribe), 它是一个在项目中经常使用的设计模式,其定义如下:
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 即:定义对象间一种一对多的依赖关系,使得每当一个对象状态改变时,则依赖于它的所有对象都会得到通知并被更新。
观察者模式的通用类图如下所示:

接下来解释观察者模式的几个角色:
- Subject 抽象被观察者。定义被观察者必须实现的功能,它必须能动态地增加、取消观察者。职责为:管理观察者并通知观察者。
- ConcreteSubject 具体的被观察者。定义自己的业务逻辑,同时定义对哪些时间进行通知。
- Observer 抽象观察者。观察者接收到消息后,即进行相关操作,对接收到的信息进行处理。
- ConcreteObserver 具体的观察者。每个观察者接收到消息后的处理反应 不一样,各个观察者有自己的处理逻辑。
观察者模式的通用代码如下:
import java.util.ArrayList;
//抽象的被观察对象
public abstract class Subject{
//定义一个观察者数组
private ArrayList<Observer> obses = new ArrayList<Observer>();
//增加观察者
public void addObserver(Observer observer){
this.obses.add(observer);
}
//移除一个观察者
public void removeObserver(Observer observer){
this.obses.remove(observer);
}
//通知所有的观察者
protected void notifyObservers(){
this.obses.forEach(ob->{
ob.update();
});
}
//被观察者业务逻辑
public abstract void doSomething();
}
//具体的被观察者
public class ConcreteSubject extends Subject{
@Override
public void doSomething() {
System.out.println("ConcreteSubject doSomething...");
super.notifyObservers();
}
}
//抽象的观察者
public abstract class Observer{
protected String name;
//业务逻辑
public abstract void update();
}
//具体的观察者
public class ConcreteObserver extends Observer{
@Override
public void update() {
System.out.println(this.name + " received message and update...");
}
public ConcreteObserver(String name){
this.name = name;
}
}
//客户端
public class ObserverClient{
public static void main(String[] args) {
//创建被观察者
Subject subject = new ConcreteSubject();
//定义被观察者
Observer observer1 = new ConcreteObserver("observer1");
Observer observer2 = new ConcreteObserver("observer2");
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.doSomething();
}
}
通用代码的运行结果如下:
ConcreteSubject doSomething...
observer1 received message and update...
observer2 received message and update...
观察者模式的应用
观察者模式的优点
- 观察者和被观察者之间是抽象耦合的。使得不管是增加观察者还是被观察者都十分容易,系统扩展方面非常简单。
- 建立一套出发机制。根据单一职责原则,每个类的职责都是单一的,观察者模式可以完美地实现触发链机制。
观察者模式的缺点
观察者模式需要考虑开发效率和运行效率。一般可以采用异步的方式。且多级触发的效率更差,设计是注意考虑。
观察者模式的使用场景
- 关联行为场景。
- 事件(多级)触发场景。
- 跨系统的消息交换场景。如消息队列的处理机制。
观察者模式的注意事项
- 广播链问题。
- 异步处理问题。
《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。
网友评论