java观察者设计模式_Java中的观察者设计模式

java观察者设计模式

在本教程中,我们将讨论Observer设计模式。

观察者模式有两个主要方面- 主题观察者当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( 主体)的状态 所有观察者都将自己注册为主题。 每当主题状态发生变化时,所有这些观察者都会得到通知。

使用此观察者模式的一个真实示例是博客订阅。 如果您订阅自己喜欢的博客,则它会在有任何更新时立即收到通知。

这样,让我们​​深入研究概念。

UML表示形式:

我们可以用以下UML表示观察者设计模式:

我们在哪里:

  • 主题:维护观察者列表,提供注册/注销观察者的方法。 另外,具有notifyAll()方法可将所有状态更改通知所有注册的观察者
  • SubjectImpl:扩展Subject类功能的类,它保存一个表示其当前状态的状态对象。 请注意, 最好有一个不可变的状态对象,以防止观察者进行任何无意的更新
  • 观察者:这是一个带有update()方法的接口,由Subject调用以将其当前状态的任何更改通知观察者
  • ConcreteObserver:这些是实现Observer接口的类,观察者对象注册自己以侦听Subject

博客订阅示例:

假设我们要在发布新帖子时通知我们的博客订阅者。 让我们使用观察者模式实现它。

为此,我们首先定义Subject类:

 public abstract class Subject {     private List<Observer> observers = new ArrayList<>();     public void register(Observer observer) { this .observers.add(observer); }     public void unregister(Observer observer) { if ( this .observers.contains(observer)) { this .observers.remove(observer); } }  public void notifyAll() { for (Observer o : observers) { o.update(); } }  } 

我们将Subject类标记为抽象的原因是我们希望Subject具有至少某种状态。

现在我们已经实现了Subject超类,让我们编写Blog类:

 public class Blog extends Subject {  private String title; private String author;     public Blog(String title, String author) { this .title = title; this .author = author; }  public void publish(Post post) { //code to publish a new post ... notifyAll(); }  public Post getRecentPost() { ... }  ...  } 

我们的Blog类从Subject扩展而来,并在post ()方法内调用notifyAll()方法,以在文章发布后立即通知所有订阅者。

实施观察者:

现在让我们定义我们的Observer接口和Subscriber类:

 public interface Observer {  void update();  }   public class Subscriber implements Observer {  private String name; private Subject subject;  public Subscriber(String name) { this .name = name; }     public void subscribeTo(Subject subject) { subject.register( this ); this .subject = subject; }     public void unsubscribeFrom(Subject subject) { subject.unregister( this ); this .subject = null ; }  @Override public void update() { if ( this .subject == null ) { System.out.println( "Not yet subscribed!" ); return ; } //get the last published post Post recentPost = this .subject.getRecentPost(); System.out.println( this .name + ", a new post got published: " + recentPost); }  } 

请注意,博客订阅者将使用subscribeTo()方法订阅博客。 用户订阅博客后,他/她将自动收到发布的所有新帖子的更新。

测试我们的实施:

让我们快速测试一下我们的代码:

 //in the main method  Subject programmerGirlBlog = new Blog( "ProgrammerGirl" , "Shubhra" );   Observer james = new Subscriber( "James" );  Observer selena = new Subscriber( "Selena" );   james.subscribeTo(programmerGirlBlog);  selena.subscribeTo(programmerGirlBlog);   Post compositeDesignPattern = new Post( "Composite Design Pattern" );   programmerGirlBlog.publish(compositeDesignPattern); 

执行上面的代码后,我们将得到如下输出:

 James, a post got published: Composite Design Pattern ... new post got published: Composite Design Pattern ...  Selena, a post got published: Composite Design Pattern ... new post got published: Composite Design Pattern ... 

结论:

在本快速教程中,我们学习了如何实现Observer设计模式。 此设计模式用于实现发布者-订阅者JMS模型。 另外, 类似java.util.EventListenerjavax.servlet.http.HttpSessionAttributeListener的类都使用此模式。

而且,很高兴知道Java提供了观察者的基本实现以及分别名为java.util.Observerjava.util.Observable的主题类。

翻译自: https://www.javacodegeeks.com/2019/09/observer-design-pattern-in-java-3.html

java观察者设计模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MacOS好用的截图工具

iShot 可以截取长图 高级功能需要付费 jietu 可以截图、录gif、MP4等等&#xff0c;自定义区域、全屏或者窗口&#xff0c;简直不要太方便。 Shottr 介绍地址&#xff1a; https://sspai.com/post/71485 https://www.appinn.com/shottr-for-macos/ cleanshot x Snipaste X…

js截取url问号前面_js截取url问号后参数并转化为对象

题目&#xff1a;js截取url问号后参数并转化为对象&#xff1b;function urlToObj(str){var obj {};var arr1 str.split("?");var arr2 arr1[1].split("&");for(var i0 ; i < arr2.length; i){var res arr2[i].split("");obj[res[0]…

HashMap的学习

文章目录HashMap特点原理示意图常用方法遍历元素LinkedHashMapHashMap 特点 1.世界上查询速度最快的数据结构 2.增删速度也很快 3.加载因子是集合存放的元素数量和散列数组长度的比值&#xff0c;建议加载因子 0.75&#xff0c;超过会自动扩容并且重新散列&#xff08;旧的数…

特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS

【0】README text description from orange’s implemention of a os . 【1】特权级概述 当当前代码段试图访问一个段或者门时&#xff0c;目标段的DPL将会和 CPL 以及段或门选择子的RPL相比较&#xff0c;如何比较&#xff1a;&#xff08;这里是干货&#xff09; &#xf…

java设计模式 订阅模式_Java中的复合设计模式

java设计模式 订阅模式当我们必须使用对象的树状分层结构时&#xff0c;复合设计模式非常有用。 它使我们能够统一对待单个对象和对象组成。 它属于结构设计模式的范畴&#xff0c;因为它将对象组合成树形结构以表示部分整个层次结构。 UML表示形式&#xff1a; 复合模式的UM…

python 短网址_Python实现短网址ShortUrl的Hash运算实例讲解

本文实例讲述了Python实现短网址ShortUrl的Hash运算方法。分享给大家供大家参考。具体如下&#xff1a;shorturl实现常见的做法都是将原始Url存储到数据库&#xff0c;由数据库返回一个对应ID。以下要实现的是不用数据库支持就对原始URL进行shorturl hash。说到这里我们很容易想…

xml json 比较_JSON和XML:它们如何比较?

xml json 比较JSON和XML&#xff1a;它们如何比较&#xff1f; JSON和XML是两种人类可读的文本格式&#xff0c;多年来已成为竞争对手。 XML的目的是通过可选使用模式来存储和定义文档和数据。 JSON几乎完全相反-序列化格式的要求非常简单&#xff0c;可以放在信用卡背面。 但是…

HashSet的学习

文章目录HashSet特点常用方法增删改查性能分析LinkedHashSetHashSet 特点 1.不允许存储重复的元素 2.只允许存储一个 null 3.没有索引值&#xff0c;所以不能使用普通的 for 循环遍历集合元素&#xff0c;也没有与索引值相关的方法 4.是一个无序的集合&#xff0c;存储元素和…

为什么引入TSS

【0】README text description from orange’s implemention of a os and for complete code ,please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/p62.asm. 【1】 回忆——关于堆栈 通过调用门进行有特权级变换的转移——理论篇 &#xff08;1&#xff…

mysql 天数减1_mysql 日期操作 增减天数、时间转换、时间戳

MySQL datediff(date1,date2)&#xff1a;两个日期相减 date1 - date2&#xff0c;返回天数。select datediff(2008-08-08, 2008-08-01); -- 7select datediff(2008-08-01, 2008-08-08); -- -7一、MySQL 获得当前日期时间 函数1.1 获得当前日期时间(date time)函数&#xff1a…

jdk open jdk_JDK 14的迹象开始出现

jdk open jdkJDK 13当前处于Rampdown阶段1 &#xff08;RDP 1&#xff09;&#xff0c;计划在一周多一点的时间&#xff08;2019年7月18日&#xff09;进入Rampdown阶段2 &#xff08;RDP 2&#xff09;&#xff0c;并暂定于2019年9月17日正式上市。当然&#xff0c;这意味着是…

Java集合ArrayList的学习

文章目录特点常用的方法集合迭代器特点 1.集合只能存放对象&#xff0c;可以存储重复元素&#xff0c;不允许存储 null 2.集合存放的对象类型可以不一致 3.集合的长度可以改变&#xff0c;初始大小10&#xff0c;最大容量 Integer.MAX_VALUE - 8&#xff0c;满时扩容&#xff…

知识复习(LDT+TSS+GATE+INTERRUPT)

【1】README 1.0&#xff09;由于实现进程的切换任务&#xff0c;其功能涉及到 LDT TSS &#xff27;ATE INTERRUPT&#xff1b;下面我们对这些内容进行复习&#xff1b; 1.1&#xff09; source code from orange’s implemention of a os . 【2】知识复习&#xff08;LDTT…

arduinopn532模块_树莓派使用libnfc驱动ITEAD NFC PN532模块

libnfc是首个遵循GNU(自由工程项目)通用公共许可证针对所有人都完全免费的低级别NFC软件开发包和编程应用程序接口。它提供了完整的透明度且免费供大家使用。该库目前支持调制ISO / IEC14443 A和B&#xff0c;FeliCa&#xff0c;Jewel/Topaz标签及数据交换协议(P2P)作为目标和启…

jakarta ee_Jakarta EE的拟议命名空间

jakarta ee免责声明&#xff1a;这是我的个人观点&#xff0c;并不代表雇主的观点。 到目前为止&#xff0c;由于从Oracle迁移到Eclipse Foundation&#xff0c;每个人都知道我们需要将所有javax软件包名称重命名为其他名称。 &#xff08;供参考&#xff0c;请参阅附录A&…

类ResourceBundle详解

类 ResourceBundle 的核心作用就是用来加载指定的属性资源文件&#xff08;.properties 文件&#xff09;&#xff0c;其作用有点类似类 Properties。 public void test() {Locale locale new Locale("zh", "CN");// 根据指定的语言环境和基名加载资源文件…

Makefile浅尝

【0】README makefile定义&#xff1a; 一个工程中的源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要一先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&a…

java类验证和装载顺序_Java类的加载顺序

1、有继承关系的加载顺序关于关键字static&#xff0c;大家 都知道它是静态的&#xff0c;相当于一个全局变量&#xff0c;也就是这个属性或者方法是可以通过类来访问&#xff0c;当class文件被加载进内存&#xff0c;开始初始化的时候&#xff0c;被static修饰的变量或者方法即…

java代码识别_识别Java中的代码气味

java代码识别作为软件开发人员&#xff0c;我们不仅要编写有效的代码&#xff0c;而且还要编写可维护的代码&#xff0c;这是我们的责任。 Martin Fowler在他的《重构&#xff1a;改进现有代码的设计》中将代码气味定义为&#xff1a; 通常对应于系统中更深层问题的表面指示 …

关于Java父子类继承的问题

1.子类无法继承父类的构造器 2.子类可以继承父类所有的变量和方法&#xff0c;父类私有的方法和变量也被继承到子类中&#xff0c;只是不可见而已&#xff0c;子类无法直接调用和访问。在子类对象中存储着父类中所有的变量的数据以及父类所有方法的引用地址。 3.被重写的父类方…