java设计模式-观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
观察者模式又名:发布-订阅(Publish/Subscribe)模式
也是很好理解,首先要记得观察者是表示一对多关系的。可以理解成有很多人在观察着你的一举一动,他们要听你的指令行事,你有新的动作时他们就要做出改变。
如果看成发布-订阅也很好理解,就是你发布一个文章,订阅你的人都能收到你的新动态。下面来看看类图
这里的subject我们把他叫做主题,下文中提到的主题都表示被观察者,observer则表示观察者。主题一有新动作,就会通知订阅他的人,告诉他们有新动态,所以主题要知道有什么人订阅他,主题对象里面要维护observer对象。
观察者对象也要知道你订阅了谁,所以观察者对象里面也要维护一个subject对象。下面来看看代码:
Observer.java
public interface Observer {
void update();
}
Subject.java
public interface Subject {
//增加观察者
void attach(Observer o);
//移除观察者
void detach(Observer o);
//提醒
void notifyObservers();
}
ConcreteSubject.java
public class ConcreteSubject implements Subject{
private List<Observer> observers =new LinkedList<>();
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public void attach(Observer o) {
observers.add(o);
}
@Override
public void detach(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
ConcreteObserver.java
public class ConcreteObserver implements Observer {
private ConcreteSubject subject;
private String name;
public ConcreteObserver(ConcreteSubject subject,String name) {
this.subject = subject;
this.name = name;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("观察者"+name+"观察到的状态是"+subject.getState());
}
}
调用
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
new ConcreteObserver(subject, "A");
new ConcreteObserver(subject, "B");
subject.setState("stateA");
subject.notifyObservers();
System.out.println("改变状态后");
subject.setState("stateB");
subject.notifyObservers();
}
打印结果
观察者A观察到的状态是stateA
观察者B观察到的状态是stateA
改变状态后
观察者A观察到的状态是stateB
观察者B观察到的状态是stateB