在本教程中,我们将讨论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); 

执行上面的代码后,我们将获得类似以下的输出:

<span><br /> James,新帖子发表:Composite Design Pattern…<br /> Selena,新帖子发表:Composite Design Pattern…</span>

 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中的观察者设计模式相关推荐

  1. Java中的观察者设计模式-示例教程

    观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为S ...

  2. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  3. Java中的策略设计模式

    策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...

  4. Java中的命令设计模式

    在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...

  5. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  6. Java中的Memento设计模式-示例教程

    记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保 ...

  7. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

  8. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  9. Java中的迭代器设计模式–示例教程

    迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...

最新文章

  1. 面试题:jdk那些类的底层实现使用过位运算,并且给你印象最深?
  2. v-if 和 v-else-if 和v-else的使用
  3. mysql服务重启后不见了_一次诡异的Mysql服务不断重启故障排查
  4. 百联OJ:2723:不吉利日期
  5. TCSVT | 横看成岭侧成峰:交叉视角地理定位
  6. 利用JDBC连接数据库(MySQL)
  7. megento 获取url参数
  8. 极其艰难地下了决心建立博客虽然没有很好的理由或者仅仅是因为觉得自己的确要改变了......
  9. php 验证手机号邮箱,PHP使用正在表达检查是否未手机号码或者邮箱
  10. 计算机网络hdlc,2019计算机考研|计算机网络知识点:HDLC协议
  11. c语言 exec sql编程,C语言采用嵌入式方式操作数据库exec_sql.doc
  12. sublime text3配置sublimelinter配合pep8和pyflakes检查python书写规范和语法
  13. 即时通讯系统的消息到达率如何保障
  14. 手机照相或选择相册,类似新浪微博的图片处理
  15. 二进制数据图片(bit-data-map): 一种通过图片的形式传递数据信息的方式
  16. 绝地求生 服务器无响应,绝地求生卡在登陆页面怎么办
  17. 数据湖Iceberg | 实时数据仓库的发展、架构和趋势
  18. 大商创 常见问题 mysql_【大商创常见问题】大商创v2.4及以上版本运费设置教程说明...
  19. RT-thread国产实时操作系统概述
  20. 2022年浙江省人民医院--互联网医院出线小报

热门文章

  1. jzoj4788-[NOIP2016提高A组模拟9.17]序列【差分,贪心】
  2. ssl1213-多边形面积【差积,计算几何】
  3. ssl1776-游乐场【图论,深搜】
  4. codeforces gym100959 I - Robots(稠密图建图优化)
  5. codeforces1271 D. Portals(dp or 带悔贪心)
  6. mybatis3中@SelectProvider的使用技巧
  7. Mysql的安装与远程登录
  8. 字符串substring方法在jkd6,7,8中的差异
  9. 【Java】continue和break区别
  10. 使用ADO.NET访问数据库