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设计模式之解释器模式(Interpreter模式)介绍

    Java设计模式之解释器模式(Interpreter模式)介绍

    这篇文章主要介绍了Java设计模式之解释器模式(Interpreter模式)介绍,Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子,需要的朋友可以参考下
    2015-03-03
  • 为spring get请求添加自定义的参数处理操作(如下划线转驼峰)

    为spring get请求添加自定义的参数处理操作(如下划线转驼峰)

    这篇文章主要介绍了为spring get请求添加自定义的参数处理操作(如下划线转驼峰),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java检查服务器的连通两种方法代码分享

    java检查服务器的连通两种方法代码分享

    这篇文章主要介绍了java检查服务器的连通两种方法代码分享,涉及ping的介绍以及检查服务器连通的两种方法代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java如何利用策略模式替代if/else语句

    Java如何利用策略模式替代if/else语句

    这篇文章主要介绍了Java如何利用策略模式替代if/else语句,帮助大家优化自己的代码,提高程序运行效率,感兴趣的朋友可以了解下
    2020-09-09
  • java实现工资管理简单程序

    java实现工资管理简单程序

    这篇文章主要为大家详细介绍了java实现工资管理简单程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Spring解决循环依赖问题及三级缓存的作用

    Spring解决循环依赖问题及三级缓存的作用

    这篇文章主要介绍了Spring解决循环依赖问题及三级缓存的作用,所谓的三级缓存只是三个可以当作是全局变量的Map,Spring的源码中大量使用了这种先将数据放入容器中等使用结束再销毁的代码风格
    2022-07-07
  • Java线上CPU内存冲高问题排查解决步骤

    Java线上CPU内存冲高问题排查解决步骤

    这篇文章主要介绍了Java线上CPU内存冲高问题排查解决步骤的相关资料,Java程序在实际生产过程中经常遇到CPU或内存使用率高的问题,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • IO 使用说明介绍

    IO 使用说明介绍

    本篇文章小编为大家介绍,IO 使用说明介绍。需要的朋友参考下
    2013-04-04
  • SpringCloud Feign使用ApacheHttpClient代替默认client方式

    SpringCloud Feign使用ApacheHttpClient代替默认client方式

    这篇文章主要介绍了SpringCloud Feign使用ApacheHttpClient代替默认client方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • spring boot项目快速构建的全步骤

    spring boot项目快速构建的全步骤

    这篇文章主要给大家介绍了关于spring boot项目快速构建的全步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09

最新评论