观察者模式:定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变的时候,所有依赖于它的对象都得到通知并被自动更新。
简单例子:比如有两个人张三和李四订阅了气象台的天气推送消息。
public class Subject
{
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer)
{
observers.add(observer);
observer.update(this);
}
public void detach(Observer observer)
{
observers.remove(observer);
}
protected void notifyObservers()
{
for(Observer observer: observers)
{
observer.update(this);
}
}
}
public interface Observer
{
public void update(Subject subject);
}
public class ConcreteSubject extends Subject
{
private String subjectState;
public String getSubjectState()
{
return subjectState;
}
public void setSubjectState(String subjectState)
{
this.subjectState = subjectState;
this.notifyObservers();
}
}
import static java.lang.System.out;
public class ConcreteObserver implements Observer
{
private String observerState;
public void update(Subject subject)
{
observerState = ((ConcreteSubject)subject).getSubjectState();
}
public void info()
{
out.println("我是:" + observerName);
out.println("信息:" + observerState);
out.println();
}
private String observerName;
public void setObserverName(String observerName)
{
this.observerName = observerName;
}
}
public class Client
{
public static void main(String[] args)
{
ConcreteSubject weatherSubject = new ConcreteSubject();
weatherSubject.setSubjectState("天气晴朗,25°");
ConcreteObserver zhangsan = new ConcreteObserver();
zhangsan.setObserverName("张三");
ConcreteObserver lisi = new ConcreteObserver();
lisi.setObserverName("李四");
weatherSubject.attach(zhangsan);
weatherSubject.attach(lisi);
zhangsan.info();
lisi.info();
weatherSubject.detach(zhangsan);
weatherSubject.setSubjectState("多云,20°");
zhangsan.info();
lisi.info();
}
}
我是:张三
信息:天气晴朗,25°
我是:李四
信息:天气晴朗,25°
我是:张三
信息:天气晴朗,25°
我是:李四
信息:多云,20°