观察者形式概念

观察者形式(Observer Pattern)是一种行为型规划形式,它界说了一种一对多的依靠联系,当一个目标的状况发生改动时,所有依靠于它的目标都能够自动地得到告诉并进行更新。这种形式也被称作是发布-订阅(Publish/Subscribe)形式。

观察者形式人物

观察者形式包括以下人物:

笼统主题(Subject):它把所有观察者目标的引用保存在一个集合里,并提供了添加和删去观察者的办法。它可所以接口或笼统类。

详细主题(Concrete Subject):它将有关状况存入详细观察者目标;当它的状况发生改动时,向它的各个观察者发出告诉。

笼统观察者(Observer):它是观察者的笼统类,它界说了一个更新接口,使得在得到主题告诉时更新自己。

详细观察者(Concrete Observer):完成笼统观察者所要求的更新接口,以便使自身的状况与主题的状况相和谐。

观察者形式代码事例

观察者形式的完成一般采纳基于接口的编程方式,下面是一个运用 Java 完成观察者形式的示例代码:

// 笼统主题
public interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers();
}
// 详细主题
public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }
    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }
}
// 笼统观察者
public interface Observer {
    void update(Subject subject);
}
// 详细观察者
public class ConcreteObserver implements Observer {
    private int state;
    @Override
    public void update(Subject subject) {
        if (subject instanceof ConcreteSubject) {
            state = ((ConcreteSubject) subject).getState();
            System.out.println("State changed to " + state);
        }
    }
}
// 示例代码
public class Example {
    public static void main(String[] args) {
        // 创立主题和观察者
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver();
        Observer observer2 = new ConcreteObserver();
        // 注册观察者
        subject.attach(observer1);
        subject.attach(observer2);
        // 改动主题状况,观察者将收到告诉并更新自己的状况
        subject.setState(1);
        subject.setState(2);
        // 刊出观察者
        subject.detach(observer2);
        // 再次改动主题状况,此刻只要 observer1 收到告诉
        subject.setState(3);
    }
}

上面的示例代码中,ConcreteSubject 作为详细主题,承继了 Subject 接口并完成了其中的办法;ConcreteObserver 作为详细观察者,完成了 Observer 接口中的办法。当主题的状况发生改动时,会调用 notifyObservers() 办法告诉所有注册过的观察者进行更新。

观察者形式小结

运用观察者形式能够建立松耦合的规划,让目标之间的依靠联系更加灵敏,是一种咱们再项目中常用的规划形式。

观察者形式具有松耦合、可扩展性强等优点,使得咱们能够在不影响主题和观察者之间联系的前提下添加新的观察者,从而在必定程度上提高了代码的灵敏性和可维护性。其缺点是需求考虑到并发问题。

好了,本篇文章就先分享到这儿了,后续将会继续介绍23种规划形式之其他形式,感谢大佬仔细读完支撑咯~