观察者模式
观察者模式(Observer)定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主体对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
采用依赖倒转的原则来实现观察者模式。主要有两个角色,行动发起者和观察者。
具体的实现如下
新建观察的主题
public interface Subject {
void update();
}
public abstract class AbstractSubject implements Subject{
protected List<Observer> observerList = new ArrayList<Observer>();
protected String subjectState;
public void attach(Observer observer) {
observerList.add(observer);
}
public void detach(Observer observer) {
observerList.remove(observer);
}
public List<Observer> getObserverList() {
return observerList;
}
public void setObserverList(List<Observer> observerList) {
this.observerList = observerList;
}
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
public class ConcreteSubject extends AbstractSubject{
@Override
public void update() {
for (Observer observer : observerList) {
observer.updateState();
}
}
}
观察者如下
public interface Observer {
void updateState();
}
public class ConcreteObserver implements Observer{
private String name;
private AbstractSubject subject;
private String state;
public ConcreteObserver(String name, AbstractSubject subject) {
super();
this.name = name;
this.subject = subject;
}
@Override
public void updateState() {
state = subject.getSubjectState();
System.out.println(name + ",boss is "+state);
}
}
使用实例
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver lijian = new ConcreteObserver("李建", subject);
ConcreteObserver xioaming = new ConcreteObserver("小明", subject);
subject.attach(lijian);
subject.attach(xioaming);
subject.setSubjectState("going");
subject.update();
subject.setSubjectState("coming");
subject.detach(xioaming);
subject.update();
}
结果
李建,boss is going
小明,boss is going
李建,boss is coming
观察者主要用于同样实现同一个更新接口的观察者在主题发生变化时,及时更新自己本身的状态,获取及时的信息。