定义对象间的一种1对多的依赖关系,每当这个对象的状态改变时,其它的对象都会接收到通知并被自动更新。
观察者模式有以下角色:
- 抽象被观察者:将所有已注册的观察者对象保存在一个集合中。
- 具体被观察者:当内部状态发生变化时,将会通知所有已注册的观察者。
- 抽象观察者:定义了一个更新接口,当被观察者状态改变时更新自己。
- 具体被观察者:实现抽象观察者的更新接口。
简单示例
1、抽象观察者
public interface IObserver {
void update(String msg);
}
2、具体观察者
public class ObserverImpl implements IObserver {
@Override
public void update(String msg) {
System.out.println("this is ObserverImpl "+hashCode()+" "+msg);
}
}
3、抽象被观察者
public interface IObservable {
public void registerObserver(IObserver o);
public void removeObserver(IObserver o);
public void notifyObservers(String message);
}
4、具体被观察者
public class ObservableImpl implements IObservable {
private List<IObserver> mList = new ArrayList();
@Override
public void registerObserver(IObserver o) {
mList.add(o);
}
@Override
public void removeObserver(IObserver o) {
if (mList != null) {
mList.remove(o);
}
}
@Override
public void notifyObservers(String message) {
for (IObserver observer : mList) {
observer.update(message);
}
}
}
5、使用
@Test
public void testObserver() {
IObservable observable = new ObservableImpl();
ObserverImpl observer1 = new ObserverImpl();
observable.registerObserver(observer1);
ObserverImpl observer2 = new ObserverImpl();
observable.registerObserver(observer2);
observable.notifyObservers("testObserver");
}
this is ObserverImpl 693632176 testObserver
this is ObserverImpl 326549596 testObserver
- 实现了观察者和被观察者之间的抽象耦合,容易扩展。
- 有利于建立一套触发机制。
- 一个被观察者卡顿,会影响整体的执行效率。采用异步机制可解决此类问题。