观察者模式

2022/2/7 23:53:37

本文主要是介绍观察者模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

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

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();
    }
}

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



这篇关于观察者模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程