观察者模式
定义:对象间存在一对多的依赖关系,当一个对象的状态发生变化时,所有依赖他的对象都得到通知并自动更新
优点:1、降低目标和观察者之间的耦合关系,符合依赖倒置原则
2、目标和观察者之间建立了一套触发机制
缺点:1、目标和观察者之间的依赖关系没有完全解除,二者有可能循环引用
2、当观察者对象很多时,发布通知会影响效率
模式的结构
1、抽象主题(抽象目标类),提供保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
2、具体主题,实现抽象主题中的方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
3、抽象观察者,是一个抽象类或接口,包含更新自己的抽象方法。
4、具体观察者,实现抽象观察者,在得到目标的更改通知时更新自身的状态。
模式的实现
package net.biancheng.c.observer;
import java.util.*;
public class ObserverPattern {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer obs1 = new ConcreteObserver1();
Observer obs2 = new ConcreteObserver2();
subject.add(obs1);
subject.add(obs2);
subject.notifyObserver();
}
}
//抽象目标
abstract class Subject {
protected List<Observer> observers = new ArrayList<Observer>();
//增加观察者方法
public void add(Observer observer) {
observers.add(observer);
}
//删除观察者方法
public void remove(Observer observer) {
observers.remove(observer);
}
public abstract void notifyObserver(); //通知观察者方法
}
//具体目标
class ConcreteSubject extends Subject {
public void notifyObserver() {
System.out.println("具体目标发生改变...");
System.out.println("--------------");
for (Object obs : observers) {
((Observer) obs).response();
}
}
}
//抽象观察者
interface Observer {
void response(); //反应
}
//具体观察者1
class ConcreteObserver1 implements Observer {
public void response() {
System.out.println("具体观察者1作出反应!");
}
}
//具体观察者1
class ConcreteObserver2 implements Observer {
public void response() {
System.out.println("具体观察者2作出反应!");
}
}
参考文献:
(1)菜鸟教程-观察者模式
(2)C语言中文网-观察者模式