观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并被自动更新。
观察者模式的参与者:
1、Subject(目标),目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者的接口。
2、Observer(观察者),为那些在目标发生改变时获得通知的对象定义一个接口。
3、ConcreteSubject(具体目标),将有关状态存入各具体目标,在具体目标的内部状态改变时,给所有登记过的观察者发出通知。
4、ConcreteObserve(具体观察者),维护一个指向ConcreteSubject对象的引用。储存有关状态,这些状态与目标的状态保持一致。
简单实现如下:
1、Subject,代码如下:
public interface Subject {
public void register(Object object);
public void remove(Object object);
public void notifyObserve();
public void setMeeting(String meeting);
}
2、ConcreteSubject,代码如下:
public class ConcreteSubject implements Subject {
private List<Object> list = new ArrayList<Object>();
private String meeting;
@override
public void register(Object object) {
list.add(object);
}
@override
public void remove(Object object) {
list.remove(object);
}
@override
public void notifyObserver() {
for(Object object : list) {
Observe observe = (Observe) object;
observe.update(meeting);
}
}
@override
public void setMeeting(String meeting) {
this.meeting = meeting;
notifyObserver();
}
}
3、Observe,代码如下:
public interface Observer {
public void update(String info);
}
4、ConcreteObserver,代码如下:
public class ObserverA implements Observer {
@override
public void update(String info) {
//收到通知后,ObserverA doSomething
System.out.println("ObserverA do something");
}
}
public class ObserverB implements Observer {
@override
public void update(String info) {
//收到通知后,ObserverB doSomething
System.out.println("ObserverB do something");
}
}
5、客户端代码如下:
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer observerA = new ObserverA();
Observer observerB = new ObserverB();
subject.register(observerA);
subject.register(observerB);
subject.setMeeting("there have a change");
}
转载地址: http://blog.youkuaiyun.com/seablue_xj/article/details/5490563