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

 更新时间:2023年07月07日 10:54:34   作者:小威要向诸佬学习呀  
观察者模式(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 观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java线程状态及jstack命令详解

    Java线程状态及jstack命令详解

    jstack是Java虚拟机(JVM)提供的一个非常有用的命令行工具,它允许开发人员和系统管理员在运行时获取Java应用程序的线程堆栈跟踪,在某些情况下,可能需要以管理员或root用户的身份运行jstack命令,这篇文章主要介绍了Java线程状态及jstack命令详解,需要的朋友可以参考下
    2024-03-03
  • 使用abstract格式修饰抽象方法

    使用abstract格式修饰抽象方法

    abstract是抽象的意思,用于修饰方法方法和类,修饰的方法是抽象方法,修饰的类是抽象类,这篇文章主要介绍了怎样使用abstract格式修饰抽象方法,需要的朋友可以参考下
    2023-05-05
  • Java实现的微信公众号获取微信用户信息示例

    Java实现的微信公众号获取微信用户信息示例

    这篇文章主要介绍了Java实现的微信公众号获取微信用户信息,结合实例形式分析了Java微信公众号获取微信用户信息相关原理、步骤与操作注意事项,需要的朋友可以参考下
    2019-10-10
  • spring + shiro + cas 实现sso单点登录的示例代码

    spring + shiro + cas 实现sso单点登录的示例代码

    本篇文章主要介绍了spring + shiro + cas 实现sso单点登录的示例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • SpringBoot 策略模式实现切换上传文件模式

    SpringBoot 策略模式实现切换上传文件模式

    策略模式是指有一定行动内容的相对稳定的策略名称,这篇文章主要介绍了SpringBoot 策略模式 切换上传文件模式,需要的朋友可以参考下
    2023-11-11
  • Java实现RSA加密工具类

    Java实现RSA加密工具类

    这篇文章主要介绍了Java如何实现RSA加密工具类,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-09-09
  • Spring中@Autowired注解作用在方法上和属性上说明

    Spring中@Autowired注解作用在方法上和属性上说明

    这篇文章主要介绍了Spring中@Autowired注解作用在方法上和属性上说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Spring Boot 3 整合 MinIO 实现分布式文件存储的全过程

    Spring Boot 3 整合 MinIO 实现分布式文件存储的全过程

    本文介绍了如何使用SpringBoot3和MinIO实现分布式文件存储,通过MinIO的分布式对象存储系统,可以解决传统单机文件存储方案在面对大规模数据和高并发访问时的不足,文章详细讲解了MinIO的安装、配置和使用,感兴趣的朋友一起看看吧
    2025-03-03
  • 使用JPA支持多参数列表查询(参数可能为空)

    使用JPA支持多参数列表查询(参数可能为空)

    这篇文章主要介绍了使用JPA支持多参数列表查询(参数可能为空),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • JDK环境变量配置的具体操作步骤

    JDK环境变量配置的具体操作步骤

    本篇文章介绍了,JDK环境变量配置的具体操作步骤。需要的朋友参考下
    2013-05-05

最新评论