观察者模式是行为型设计模式的一种,又叫做发布-订阅模式,观察者订阅主题,只要主题发生变更,就会通知观察者发生变化。比如MQ以及zookeeper中的watch机制都是这个模式的体现。
观察者模式的好处是模块之间,一个模块有变化可以及时通知另外的模块做出动作,可以方便扩展可以添加删除观察者。
Subject:抽象主题
ConcreteSubject:具体主题,实现了添加 删除 通知观察者逻辑
Observer:抽象观察者
ConcreteObsever:具体观察者,实现更新了操作
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
public class ObserverImpl extends Observer{
public ObserverImpl(Subject subject){
this.subject = subject;
this.subject.add(this);
}
@Override
public void update() {
System.out.println("更新后的数据:"+this.subject.getValue());
}
}
public interface Subject {
public void add(Observer observer);
public void remove(Observer observer);
public void notifyAllObservers();
public int getValue();
public void setValue(int value);
}
public class SubjectImpl implements Subject{
private int value;
private List<Observer> observers;
public SubjectImpl(){
observers = new ArrayList<>();
}
@Override
public void add(Observer observer) {
observers.add(observer);
}
@Override
public void remove(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyAllObservers() {
for(Observer observer:observers){
observer.update();
}
}
@Override
public int getValue() {
return value;
}
@Override
public void setValue(int value) {
this.value = value;
notifyAllObservers();
}
}
客户端类进行调用:
public class Client {
public static void main(String[] args) {
Subject subject = new SubjectImpl();
Observer observer = new ObserverImpl(subject);
subject.setValue(12);
}
}