迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 算法 >

Java 中的观察者设计模式

作者:迹忆客 最近更新:2023/02/17 浏览次数:

Java 中的观察者设计模式是一种基本的核心 Java 模式,其中 Observe 监视 Subject 的状态或属性的任何变化。 例如,公司向所有股东更新他们在这里做出的任何决定公司是主体,股东是观察员,公司政策的任何变化和公司通知所有股东或观察员。 这是对观察者模式的一个简单的现实世界解释。

在本文中,我们将详细介绍什么是观察者设计模式、观察者设计模式的好处、Java 中的示例或观察者模式以及其他几点。 就像Java中的装饰器设计模式和工厂模式一样,JDK中也使用了观察者模式。


观察者设计模式Java代码示例

现在,让我们深入探讨观察者设计模式以及如何在 Java 编程语言中使用它:

顺便说一句,为了最好地理解设计模式,大家需要制定一些场景、示例等。

1. 什么是观察者设计模式?

Java中的观察者设计模式是一个非常重要的模式,顾名思义就是用来观察事物的。 假设我们想通知特定对象的更改,然后我们会观察到该对象并通知更改。 被观察的对象称为 Subject,观察 subject 的类称为 Observer。

这是一个漂亮的模式,并与模型视图控制器设计模式一起大量使用,在该模式中,模型的更改会传播到视图,以便它可以使用修改后的信息来呈现它。 观察者模式也是一个非常流行的 Java 面试问题,主要被问到高级或中高级水平。

2.观察者模式解决的问题:

如果我们要求特定对象改变其状态并取决于这改变了一些或一组对象自动改变它们的状态我们需要实现观察者模式它会减少对象之间的耦合。 在现实世界中,如果尝试查找示例,请看当客户在该公司注册时我们订阅新电话连接时,所有其他部门都会收到相应的通知,然后根据状态执行他们的工作,例如验证他们的地址,然后如果客户状态 验证后发送欢迎套件等。


观察者设计模式是如何在 Java 中实现的;

对于这种模式的实现,java 使我们的任务变得非常容易,开发人员不需要为实现这种模式做太多事情。在 java.util 包中,我们可以找到实现这种模式的接口、类和方法。

Public Interface观察者:

当主体或可观察对象改变其状态时,必须通知任何实现此接口的类。

Update (Observable Ob, Object arg):当主题改变时调用此方法。

Observable类:

这是观察者想要观察的对象。

一些重要的方法:

  • addObserver(Observer o) :在这个subject或observalbel对象的观察者集合中添加Observers。
  • deleteObserver(Observer o) :删除观察者集合中的观察者。
  • hasChanged() :检查对象是否已经改变。
  • clearChanged() :此方法将指示主题没有更改或更改时已通知所有观察者。
  • notifyObservers() :如果对象发生变化,通知所有观察者。

Java中观察者设计模式的代码示例:

观察者设计模式比它在 Java 中的实现方式更通用。 我们可以自由选择 java.util.Observablejava.util.Observer 或编写我们自己的 Subject 和 Observer 接口。 我更喜欢拥有自己的 Subject 和 Observer 接口,这就是我将如何用 java 编写 Observer 设计模式的代码示例。

我的示例非常简单,有一笔利率可能会发生变化的贷款,当它发生变化时,贷款会通知报纸或互联网媒体以显示新的贷款利率。

为了实现这一点,我们有一个 Subject 接口,其中包含用于添加、删除和通知 Observers 的方法,以及一个 Observer 接口,其中包含 update(int interest) 方法,当利率发生变化时,该方法将由 Subject 实现调用。

import java.util.ArrayList;

interface Observer {
       public void update(float interest);
}

interface Subject {
       public void registerObserver(Observer observer);

       public void removeObserver(Observer observer);

       public void notifyObservers();
}

class Loan implements Subject {
       private ArrayList<Observer> observers = new ArrayList<Observer>();
       private String type;
       private float interest;
       private String bank;

       public Loan(String type, float interest, String bank) {
              this.type = type;
              this.interest = interest;
              this.bank = bank;
       }

       public float getInterest() {
              return interest;
       }

       public void setInterest(float interest) {
              this.interest = interest;
              notifyObservers();
       }

       public String getBank() {
              return this.bank;
       }

       public String getType() {
              return this.type;
       }

       @Override
       public void registerObserver(Observer observer) {
              observers.add(observer);

       }

       @Override
       public void removeObserver(Observer observer) {
              observers.remove(observer);

       }

       @Override
       public void notifyObservers() {
              for (Observer ob : observers) {
                     System.out
                                  .println("Notifying Observers on change in Loan interest rate");
                     ob.update(this.interest);
              }

       }

}

class Newspaper implements Observer {
       @Override
       public void update(float interest) {
              System.out.println("Newspaper: Interest Rate updated, new Rate is: "
                           + interest);
       }
}

class Internet implements Observer {
       @Override
       public void update(float interest) {
              System.out.println("Internet: Interest Rate updated, new Rate is: "
                           + interest);
       }
}

public class ObserverTest {

       public static void main(String args[]) {
              // this will maintain all loans information
              Newspaper printMedia = new Newspaper();
              Internet onlineMedia = new Internet();

              Loan personalLoan = new Loan("Personal Loan", 12.5f,
                           "Standard Charterd");
              personalLoan.registerObserver(printMedia);
              personalLoan.registerObserver(onlineMedia);
              personalLoan.setInterest(3.5f);

       }
}

Java中观察者设计模式的优势:

主要优点是称为观察者和可观察对象之间的松散耦合。 主题只知道观察者列表,它不关心他们如何实现。所有观察者都由主题在单个事件调用中作为广播通信通知

Java中观察者设计模式的缺点:

  • 缺点是有时如果出现任何问题,调试会变得非常困难,因为控制流隐含在观察者和可观察者之间,我们可以预测现在观察者将有动作,如果观察者之间存在链,则调试会变得更加复杂。
  • 另一个问题是内存管理,因为如果我们不注销对象,主题将持有所有观察者的所有引用,这会造成内存问题。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 Java 在 MongoDB 中生成 ObjectId

发布时间:2023/04/20 浏览次数:179 分类:MongoDB

本文将讨论 ObjectId 以及我们如何使用 Java 程序生成它。 为了使主题更简单,我们将看到一个带有解释的示例,以使主题更容易。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便