观察者模式在实际应用中用到的比较多,比如QT中信号-槽机制,MVC模式中的模型-视图,这些都是基于观察者模式。
定义:指多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要优点:
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。
- 目标与观察者之间建立了一套触发机制。
UML图如下:
示例代码:
// 抽象目标
abstract class Subject {
protected List<Observer> observers = new List<Observer>();
// 增加观察者方法
public void add(Observer observer) {
this.observers.add(observer);
}
// 删除观察者方法
public void remove(Observer observer) {
observers.remove(observer);
}
// 通知观察者方法
public abstract void notifyObserver();
}
// 具体目标
class ConcreteSubject {
public void notifyObserver() {
System.out.println("具体目标发生改变");
System.out.println("-----------------------------------");
for(Observer obs: observers) {
((Observer)obs).response();
}
}
}
// 抽象观察者
interface Observer {
void response();
}
// 具体观察者1
class ConcreteObserver1 implements Observer {
public void response() {
System.out.println("具体观察者1作出反应!");
}
}
// 具体观察者2
class ConcreteObserver2 implements Observer {
public void response() {
System.out.println("具体观察者2作出反应!");
}
}
// 客户类
public class Client {
public static void main() {
Subject subject = new ConcreteSubject(); // 创建具体目标
Observer obs1 = new ConcreteObserver1(); // 创建观察者1
Observer obs2 = new ConcreteObserver2(); // 创建观察者2
subject.add(obs1);
subject.add(obs2);
System.out.println("目标对象状态发生改变");
subject.notifyObserver(); // 发出通知事件
}
}
扩展:Qt的信号-槽机制,一个信号可以连接多个槽函数,一个槽函数也可以连接多个信号。