1.定义
- 定义被观察者与观察者之间的一对多关系,使得Subject改变时,Observers都被通知到
- 使用较多,如数据库监听、发布-订阅系统
2.UML类图

- 角色介绍
ISubject : 抽象被观察者
ConcreteSubject : 具体被观察者
IObserver : 抽象观察者
ConcreteObserverA : 具体观察者,观察Subject的变化
ConcreteObserverB : 具体观察者 - 要点
被观察者持有抽象观察者的引用
3.UML示例代码
/**
* Copyright (C), 2016-2020
* FileName: IObserver
* Author: wei.zheng
* Date: 2019/12/16 9:22
* Description: 抽象观察者接口
*/
public interface IObserver {
void update(String content);
}
/**
* Copyright (C), 2016-2020
* FileName: ConcreteObserverA
* Author: wei.zheng
* Date: 2019/12/16 9:24
* Description: 具体观察者A
*/
public class ConcreteObserverA implements IObserver {
@Override
public void update(String content) {
System.out.println("ConcreteObserverA receive update: " + content);
}
}
/**
* Copyright (C), 2016-2020
* FileName: ConcreteObserverB
* Author: wei.zheng
* Date: 2019/12/16 9:24
* Description: 具体观察者B
*/
public class ConcreteObserverB implements IObserver {
@Override
public void update(String content) {
System.out.println("ConcreteObserverB receive update: " + content);
}
}
/**
* Copyright (C), 2016-2020
* FileName: ISubject
* Author: wei.zheng
* Date: 2019/12/16 9:26
* Description: 抽象被观察者接口
*/
public interface ISubject {
void notifyObservers();
}
/**
* Copyright (C), 2016-2020
* FileName: ConcreteSubject
* Author: wei.zheng
* Date: 2019/12/16 9:27
* Description: 具体被观察者, 模拟改变状态,通知各个观察者
*/
public class ConcreteSubject implements ISubject {
private List<IObserver> observerList = new ArrayList<>();
private String state;
public void setState(String state) {
this.state = state;
}
public void attach(IObserver observer) {
this.observerList.add(observer);
}
@Override
public void notifyObservers() {
for (IObserver observer : observerList) {
observer.update("state changed to " + state);
}
}
}
/**
* Copyright (C), 2016-2020
* FileName: Client
* Author: wei.zheng
* Date: 2019/12/16 9:30
* Description: 观察者模式用户类
*/
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
IObserver observerA = new ConcreteObserverA();
IObserver observerB = new ConcreteObserverB();
subject.attach(observerA);
subject.attach(observerB);
// 被观察者Subject改变内部状态,通知到各个观察者Observer
subject.setState("Active");
subject.notifyObservers();
}
}
// 运行结果
2019-12-16 09:38:10.203 15870-15870/com.example.observer I/System.out: ConcreteObserverA receive update: state changed to Active
2019-12-16 09:38:10.203 15870-15870/com.example.observer I/System.out: ConcreteObserverB receive update: state changed to Active
4.总结
- 优缺点
优点:将被观察者与观察者之间完全解耦(或者叫抽象耦合),应用较为广泛;
缺点:当观察者较多时,注意执行效率,适当采用异步的通知方式。
来源:CSDN
作者:郑伟自在如风
链接:https://blog.csdn.net/qq_37514242/article/details/103557390