观察者模式

观察者模式又叫做发布-订阅模式。

定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己。

Subject:主题或抽象通知者。把所有对观察者对象的引用保存在一个聚合里面。

public abstract class Subject {
    private List<Observer> observers = new ArrayList<>();
    //增加观察者
    public void attach(Observer observer){
        observers.add(observer);
    }
    //移除观察者
    public void detach(Observer observer){
        observers.remove(observer);
    }
    //通知
    public void notifyData(){
        for (Observer ob:observers) {
            ob.update();
        }
    }
}

Observer,抽象观察者,在得到主题的通知时更新自己。

public abstract class Observer {
    public abstract void update();
}

ConcreteSubject,具体主题或具体通知者,将有关状态存入。具体主题的内部状态变化,给所有观察者发出通知

public class ConcreteSubject extends Subject {
    private String subjectState;

    public String getSubjectState() {
        return subjectState;
    }

    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
    }
}

ConcreteObserver,具体观察者,使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用。

public class ConcreteObserver extends Observer {
    private String name;
    private String observerState;
    private ConcreteSubject subject;

    public ConcreteObserver(String name, ConcreteSubject subject) {
        this.name = name;
        this.subject = subject;
    }

    @Override
    public void update() {
        observerState = subject.getSubjectState();
    }

    public ConcreteSubject getSubject() {
        return subject;
    }

    public void setSubject(ConcreteSubject subject) {
        this.subject = subject;
    }
}

Main:

public class Main {
    public static void main(String[] args) {
        ConcreteSubject concreteSubject = new ConcreteSubject();
        concreteSubject.attach(new ConcreteObserver("x",concreteSubject));
        concreteSubject.attach(new ConcreteObserver("y",concreteSubject));
        concreteSubject.attach(new ConcreteObserver("z",concreteSubject));
        concreteSubject.setSubjectState("abc");
        concreteSubject.notifyData();
    }
}

使用场景:当一个对象的改变需要同时改变其他对象的时候。

上一篇:logTracker错误日志跟踪组件(二)


下一篇:设计模式--模版模式