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

news/2024/12/2 17:48:54/

观察者(Observer)模式可以在多个对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知。

什么是观察者模式

观察者模式(Observer pattern)是一种非常常用的设计模式,它可以建立一种一对多的依赖关系,确保当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知。在观察者模式中,通常会定义一个主题对象和多个观察者对象。主题对象负责维护一组观察者对象,并在自身状态发生改变时通知这组观察者对象。观察者对象可以是任何类型的对象,它们会在主题对象发生改变时接收到通知,并进行相应的逻辑处理。

观察者模式的应用场景

  1. 当一个对象的状态改变时,需要通知其他对象进行相应的处理时,可以使用观察者模式。例如,当系统中某个数据模型发生变化时,需要立即通知到已经注册过该模型变化的其他组件进行处理。

  2. 当需要将不同子系统之间的解耦时,可以使用观察者模式。例如,当子系统之间需要进行消息传递,但是又不希望子系统之间直接进行耦合时,可以使用观察者模式进行消息传递。

观察者模式的代码示例

以下是一个简单的观察者模式示例代码:

主题对象接口:

public interface Subject {public void attach(Observer observer); // 添加观察者public void detach(Observer observer); // 删除观察者public void notifyObservers(); // 通知所有观察者
}

观察者对象接口:

public interface Observer {public void update(); // 观察者对象接收到通知后的逻辑处理
}

具体主题对象类:

public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<Observer>(); // 存储所有观察者对象private int subjectState; // 主题对象状态public void attach(Observer observer) {observers.add(observer); // 添加观察者}public void detach(Observer observer) {observers.remove(observer); // 删除观察者}public void notifyObservers() {for (Observer observer : observers) {observer.update(); // 通知所有观察者}}public int getState() {return subjectState;}public void setState(int state) {this.subjectState = state;notifyObservers(); // 主题对象状态发生改变,通知所有观察者}
}

具体观察者对象类:

public class ConcreteObserver implements Observer {private int observerState; // 观察者对象状态private Subject subject; // 主题对象public ConcreteObserver(Subject subject) {this.subject = subject;subject.attach(this); // 将该观察者对象注册到主题对象中}public void update() {observerState = subject.getState(); // 观察者对象接收到通知后更新自身状态System.out.println("Observer state updated: " + observerState); // 打印输出更新后的状态值}
}

测试代码:

public class ObserverPatternDemo {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject(); // 创建主题对象ConcreteObserver observer1 = new ConcreteObserver(subject); // 创建观察者对象1,并将其注册到主题对象中ConcreteObserver observer2 = new ConcreteObserver(subject); // 创建观察者对象2,并将其注册到主题对象中subject.setState(10); // 改变主题对象的状态,触发所有观察者对象更新逻辑}
}

运行结果:

Observer state updated: 10
Observer state updated: 10

在上面的示例代码中,我们首先定义了主题对象接口 Subject 和观察者对象接口 Observer。然后我们实现了具体的主题对象类 ConcreteSubject 和具体的观察者对象类 ConcreteObserver,在具体主题对象类中添加、删除和通知观察者对象,更改状态值并且通知所有的观察者对象。在具体观察者对象类 ConcreteObserver 中,实现更新自身状态的逻辑和打印输出更新后状态原来的值。在 ObserverPatternDemo 中我们创建主题对象,并创建两个观察者对象并将它们注册到主题对象中,再改变主题对象的状态,触发所有观察者对象更新逻辑,最后打印输出更新后的状态值。

观察者模式的实际应用

在实际开发中,观察者模式是一个非常常用的设计模式,在许多框架中都有使用,下面是一些常用框架中使用了观察者 Observer 设计模式的例子:

  1. JDK 中的事件机制: JDK 中提供了大量的事件类和接口,从而实现了一种事件驱动模型。例如 ActionListener 接口、MouseListener 接口等等都是观察者接口,实现它们的类都是观察者对象,而主题对象则是事件源对象(如按钮对象等)。

  2. Spring 框架中的事件机制: Spring 框架中也提供了事件机制,可以通过 ApplicationContext 对象向所有注册的监听器对象发送事件,从而实现一种松耦合的消息传递方式。在 Spring 中,事件源对象可以是任何对象,而事件监听器就是观察者对象。

  3. Android 中的广播机制: Android 中有一种广播机制,可以用于组件间的信息传递。在广播机制中,发送广播的对象就是事件源对象,而广播接收器则是观察者对象。

  4. JavaFX 框架中的 Property 机制: JavaFX 中的 Property 对象是观察者模式的实现,它允许绑定两个对象,当其中一个对象的值发生变化时,另一个对象会自动更新为最新值。

关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩‍💻👨‍💻!


http://www.ppmy.cn/news/976655.html

相关文章

深圳内推 | 腾讯IEG互动娱乐事业群招聘算法工程师、数据研究员(可实习)

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 腾讯 腾讯互动娱乐已成为全球领先的综合互动娱乐服务品牌&#xff0c;旗下涵盖腾讯游戏、腾…

腾讯2014年实习生招聘广州站offer经历(TEG-后台开发)

过去的一年学的都是linux 系统编程和网络编程方面的东西&#xff0c;比较熟悉的语言也是c/c&#xff0c;python仅限写一些测试客户端。所以这学期开始投的实习职位都是后台开发类&#xff0c;比如前面笔面的网易CC&#xff08;面完hr后挂&#xff09;。大概3月15号就在腾讯 joi…

MAC 推送证书不受信任

配置推送证书的时候&#xff0c;一打开就变成不受信任&#xff0c;搜了很多解决版本。 由于苹果修改相关规定&#xff0c;推送证书 打开Apple PKI - Apple 下载AppleWWDRCA文件&#xff0c;选择G4,双击安装之后&#xff0c;证书已经变为受信任。 AppleWWDRCA(Apple Worldwid…

订单逆向履约系统的建模与PaaS化落地实践 | 京东云技术团队

导读 本文重点介绍了京东零售电商业务在订单逆向履约上面的最佳技术实践&#xff0c;京东零售快退平台承接了零售几乎所有售前逆向拦截和退款业务&#xff0c;并在长期的业务和技术探索中沉淀了丰富的业务场景设计方案、架构设计经验&#xff0c;既能承接面向消费者C端用户的高…

功能测试也可以发现数据库相关的性能问题

很多同学认为功能测试和性能测试是严格分开的&#xff0c;功能测试人员无法发现性能问题。其实不是这样的&#xff0c;功能测试人员在验证功能时也可以发现性能问题&#xff1b;一些功能反而在功能测试环境不好验证&#xff0c;需要在性能环境上测试。 今天咱们就说一下测试涉及…

深兰科技大模型入围2023年数字经济应用场景“揭榜挂帅” 项目名单

7月17日&#xff0c;武汉市2023年数字经济应用场景“揭榜挂帅”拟揭榜项目名单&#xff0c;正式揭晓公示。 在经专家评审、项目路演、现场核查等层层遴选之后&#xff0c;由深兰科技武汉研发中心、深兰科技(上海)有限公司联合武汉碧水产业发展有限公司、武汉江汉路步行街投资发…

Java虚拟机——后端编译与优化

编译器无论在何时、何种状态下将Class文件转换成与本地基础设施相关的二进制机器码&#xff0c;它都可以视为整个编译过程的后端。即时编译一直是绝对主流的编译形式&#xff0c;不过提前编译也逐渐被主流JDK支持。 1 即时编译器 目前两款主流的Java虚拟机&#xff08;HotSpo…

深度解读智能时代下,微软如何开启数字化转型新纪元?

作者 | 伍杏玲 出品 | CSDN 今年以来&#xff0c;微软频频放大招&#xff0c;以 Microsoft Build 大会为例&#xff0c;接连重磅更新引发 IT圈热议。微软正在创造未来&#xff0c;将最前沿的智能技术贯穿各业务线&#xff0c;有效提高生产研发效率、办公协同效率&#xff0c;助…