观察者模式
1、定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
2、结构
3、代码
(1)主题接口
public interface ISubject {
public ISubject registerObserver(IObserver observer);
public ISubject removeObserver(IObserver observer);
public void notifyObserver();
}
(2)观察者接口
public interface IObserver {
public void update(String status);
}
(3)主题实现
public class ConcreteSubject implements ISubject {
private List<IObserver> observerList = new ArrayList<IObserver>();
private String status;
@Override
public ISubject registerObserver(IObserver observer) {
if(!observerList.contains(observer)){
observerList.add(observer);
}
return this;
}
@Override
public ISubject removeObserver(IObserver observer) {
if(observerList.contains(observer)){
observerList.remove(observer);
}
return this;
}
@Override
public void notifyObserver() {
for(IObserver observer: observerList){
observer.update(status);
}
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
//状态改变后执行通知操作
notifyObserver();
}
}
(4)观察者实现1
public class ConcreteObserver1 implements IObserver{
@Override
public void update(String status) {
System.out.println("ConcreteObserver1收到通知:当前状态为"+status);
}
}
(5)观察者实现2
public class ConcreteObserver2 implements IObserver{
@Override
public void update(String status) {
System.out.println("ConcreteObserver2收到通知:当前状态为"+status);
}
}
(6)客户端
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.registerObserver(new ConcreteObserver1())
.registerObserver(new ConcreteObserver2());
subject.setStatus("123");
}
}
4、总结
推模型和拉模型
在观察者模式中,又分为推模型和拉模型两种方式。
● 推模型
主题对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。
● 拉模型
主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当于是观察者从主题对象中拉数据。一般这种模型的实现中,会把主题对象自身通过update()方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。