学习书籍《设计模式之禅》,做个学习笔记。
#1.定义
观察者模式定义:
Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
#2.代码
观察者接口:
//观察者接口
public interface IObserver {
//更新方法
void update();
}
被观察者抽象类:
//被观察者抽象类
public abstract class AbstractObservable {
//用来保存观察者
private Vector<IObserver> list = new Vector<>();
//添加观察者
public void addObserver(IObserver IObserver) {
this.list.add(IObserver);
}
//移除观察者
public void deleteObserver(IObserver IObserver) {
this.list.remove(IObserver);
}
//通知所有观察者
public void notifyObservers() {
for (IObserver IObserver : list) {
IObserver.update();
}
}
}
观察者具体类:
public class Observer implements IObserver {
@Override
public void update() {
System.out.println("接收到通知消息");
}
}
被观察者具体类:
//具体的被观察者
public class Observable extends AbstractObservable {
public void doSomething() {
//...执行一些逻辑
//执行完逻辑就通知观察者
super.notifyObservers();
}
}
场景测试:
public static void main(String[] args) {
//创建被观察者
Observable observable = new Observable();
//创建观察者
Observer observer = new Observer();
//添加观察者
observable.addObserver(observer);
//被观察者执行逻辑即可通知观察者(观察者中打印)
observable.doSomething();
}
#3.观察者模式的优缺点
优点:增加观察者或者被观察者都很容易扩展。
缺点:比较容易影响效率,一旦某个观察者处理逻辑时间较长,则会影响其他观察者处理请求。
#4.注意点
某个对象最好有单一原则,即要么是观察者,要么是被观察者,最多出现一个既是观察者也是被观察者的对象,否则逻辑会很复杂,很难维护和扩展。
观察者处理时间较长,则可考虑异步处理,此时要多加注意线程安全和队列的问题。
#5.观察者模式的扩展
Java中已经封装好了Observable(java.util.Observable)
,所以可以直接继承该类,不需要再手动写添加和删除观察者的代码,如。
A-被观察者
public class A extends Observable {
//默认封装了添加和删除、通知观察者的方法
public void doSomething() {
System.out.println("A开始行动了");
//声明改变了
super.setChanged();
//将消息通知所有的观察者
super.notifyObservers("A开始行动了");
}
}
B-观察者
public class B implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("收到消息: " + arg.toString());
}
}
场景测试:
A a = new A();
a.addObserver(new B());
a.doSomething();
结果:
A正在做一些事
观察到了,正在: A开始行动了