Design Patterns教程-观察者模式
观察者模式的定义是“定义一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会被自动通知并更新”。
观察者模式也被称为依赖(Dependents)或发布-订阅(Publish-Subscribe)模式。
优点:
- 它描述了对象和观察者之间的耦合关系。
- 它提供了广播类型的通信支持。
使用场景:
- 当一个对象的状态变化必须反映在另一个对象中,而不需要让对象之间紧密耦合时。
- 当我们编写的框架需要在将来通过添加新的观察者来增强时,并且希望进行最小的更改。
观察者模式的UML:
观察者模式的实现
步骤 1:
创建一个实现java.util.Observer
接口的ResponseHandler1
类。
// 这是一个类
import java.util.Observable;
import java.util.Observer;
public class ResponseHandler1 implements Observer {
private String resp;
@Override
public void update(Observable obj, Object arg) {
if (arg instanceof String) {
resp = (String) arg;
System.out.println("\nReceived Response: " + resp );
}
}
}
步骤 2:
创建一个实现java.util.Observer
接口的ResponseHandler2
类。
// 这是一个类
import java.util.Observable;
import java.util.Observer;
public class ResponseHandler2 implements Observer {
private String resp;
@Override
public void update(Observable obj, Object arg) {
if (arg instanceof String) {
resp = (String) arg;
System.out.println("\nReceived Response: " + resp );
}
}
}
步骤 3:
创建一个继承java.util.Observable
类的EventSource
类。
// 这是一个类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Observable;
public class EventSource extends Observable implements Runnable {
@Override
public void run() {
try {
final InputStreamReader isr = new InputStreamReader(System.in);
final BufferedReader br = new BufferedReader(isr);
while (true) {
String response = br.readLine();
setChanged();
notifyObservers(response);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
步骤 4:
创建一个ObserverPatternDemo
类来展示观察者模式的使用。
// 这是一个类
public class ObserverPatternDemo {
public static void main(String[] args) {
EventSource eventSource = new EventSource();
ResponseHandler1 handler1 = new ResponseHandler1();
ResponseHandler2 handler2 = new ResponseHandler2();
eventSource.addObserver(handler1);
eventSource.addObserver(handler2);
Thread thread = new Thread(eventSource);
thread.start();
}
}
输出:
当在控制台输入文本时,将会显示如下输出:
Received Response: <您输入的文本>
每次输入新的文本,所有的观察者(ResponseHandler1
和ResponseHandler2
)都会收到更新的响应并输出相应的信息。