java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java 观察者模式

Java设计模式之观察者模式(Observer Pattern)详解

作者:小威要向诸佬学习呀

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能够自动地得到通知并进行更新,本文将详细的给大家介绍一下Java观察者模式,需要的朋友可以参考下

观察者模式概念

观察者模式(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() 方法通知所有注册过的观察者进行更新。

观察者模式小结

使用观察者模式能够建立松耦合的设计,让对象之间的依赖关系更加灵活,是一种我们再项目中常用的设计模式。

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

到此这篇关于Java设计模式之观察者模式(Observer Pattern)详解的文章就介绍到这了,更多相关Java 观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文