设计模式(九)——观察者模式(Observer)
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式
优点
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。
- 目标与观察者之间建立了一套触发机制。
缺点
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
实现
孩子作为被观察者,爸爸和妈妈作为观察者,当孩子哭时会通知爸爸妈妈,观察者会做出相应的反应
观察者,有response方法,观察后做出的反应
public interface Observer {
void response(); //反应
}
具体观察者:妈妈
public class ConcreteObserver1 implements Observer{
@Override
public void response() {
System.out.println("妈妈给孩子喂奶");
}
}
具体观察者:爸爸
public class ConcreteObserver2 implements Observer{
@Override
public void response() {
System.out.println("爸爸逗孩子");
}
}
被观察者,有一个观察者列表属性,和通知观察者的方法。
public abstract class Subject {
List<Observer> observerList = new ArrayList<>();
public void add(Observer observer){
observerList.add(observer);
}
public abstract void notifyObserver();
}
具体被观察者:孩子,孩子哭的时候,会通知观察者,调用观察者的方法
//具体目标对象
public class ConcreteSubject extends Subject{
@Override
public void notifyObserver() {
System.out.println("孩子哭了");
for (Observer observer : observerList) {
observer.response();
}
}
}
public class Main {
public static void main(String[] args) {
ConcreteSubject concreteSubject = new ConcreteSubject();
concreteSubject.add(new ConcreteObserver1());
concreteSubject.add(new ConcreteObserver2());
concreteSubject.notifyObserver();
}
}
运行结果: