观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并被自动更新。
观察者模式的参与者:
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(); } }
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"); } }
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"); }