首页 > 其他分享 >Observable(观察者)设计模式

Observable(观察者)设计模式

时间:2024-10-08 09:44:33浏览次数:6  
标签:Observable name Observer void 观察者 设计模式 public String

前言

Observable设计模式存在于许多Java API和响应式编程中。下面介绍Java中永恒的Observable模式。

  • Observable设计模式用于许多重要的Java API。一个众所周知的示例是使用ActionListenerAPI执行操作的JButton。在这个例子中,我们ActionListener在按钮上进行了监听或观察。单击按钮时,ActionListener将执行操作。

  • Observable模式也用于响应式编程。在反应式应用程序中使用观察者是有道理的,因为反应式的本质是反应:当另一个进程发生时,事情就会发生。

  • Observable是一种行为设计模式。它的功能是在事件发生时执行一个动作。两个常见的例子是按钮点击和通知,但这种模式还有更多用途。

例子

在Observable设计模式中,一个对象在执行操作时会通知另一个对象。为了理解该模式的价值,让我们想象一个需要单击按钮并且没有通知另一个对象的场景,如图1所示,ActionCheck 每秒检查一次按钮:
image
请注意,ActionCheck必须每秒检查一次按钮。现在,想象一下,如果我们每秒对该按钮进行多次操作检查。您能想象这会对您的应用程序性能产生什么影响吗?
让Do Something按钮通知ActionCheck.这样,ActionCheck逻辑就不需要每秒轮询Do Something按钮。

Observable设计模式的元素

在下图中,请注意观察者模式的基础是 Observer 接口(即观察的对象)和 Subject(被观察的对象)。类Newsletter implements Subject 和 Subscriber implements Observer。最后,SendEmailMain 是我们的主线程,它来触发变化。如图2所示
image

代码

Subject

被观察者的行为会被监听,特殊行为会触发事件

public interface Subject {

   void addSubscriber(Observer observer);
   void removeSubscriber(Observer observer);
   void notifySubscribers();

}

Observer

观察者监听到 Subject 的特殊行为,会做对应的逻辑处理

public interface Observer {

   public void update(String email);

}

Newsletter(发布者)

Newsletter 是 Subject 的实现类,它会存储 Observer,当特殊行为发生时会通知 Observer

import java.util.ArrayList;
import java.util.List;

public class Newsletter implements Subject {

   protected List<Observer> observers = new ArrayList<>();
   protected String name;
   protected String newEmail;

   public Newsletter(String name) {
       this.name = name;
   }

   public void addNewEmail(String newEmail) {
       this.newEmail = newEmail;
       // 添加了新的邮件联系人就要通知观察者
       notifySubscribers();
   }

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

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

   @Override
   public void notifySubscribers() {
       observers.forEach(observer -> observer.update(newEmail));
   }
}

Subscriber(订阅者)

此类实现了Observer接口

class Subscriber implements Observer {

  private String name;

  public Subscriber(String name) {
    this.name = name;
  }

  @Override
  public void update(String newEmail) {
     System.out.println("Email for: " + name + " | Content:" + newEmail);
  }
}

SendEmailMain(测试用例)

public class SendEmailMain {

 public static void main(String[] args) {
   Newsletter newsLetter = new Newsletter("Java Challengers");

   Observer duke = new Subscriber("Duke");
   Observer juggy = new Subscriber("Juggy");
   Observer dock = new Subscriber("Moby Dock");

   newsLetter.addSubscriber(duke);
   newsLetter.addNewEmail("Lambda Java Challenge");
   newsLetter.removeSubscriber(duke);

   newsLetter.addSubscriber(juggy);
   newsLetter.addSubscriber(dock);
   newsLetter.addNewEmail("Virtual Threads Java Challenge");
 }

}

输出如下
image
转载:https://www.jianshu.com/p/77ed2c481fde

标签:Observable,name,Observer,void,观察者,设计模式,public,String
From: https://www.cnblogs.com/xianfengzhike/p/18451063

相关文章

  • 设计模式-建造者模式
    什么是建造者模式?建造者模式是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程。简单模拟场景:装修公司的套餐服务,豪华、简约风格。比如对于吊顶和地板,有一级二级吊顶,一级二级地板等。按不同的套餐价格选取不同的组合。物料接口:publicinterfaceMatter{......
  • 模板设计模式
    模板设计模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,而将一些步骤的实现延迟到子类中。结构抽象类(AbstractClass)定义了模板方法(TemplateMethod),它包含了算法的骨架,通常是一个final方法,以防止子类重写整个算法流程。同时定义了一些抽象方法(AbstractMethod),这......
  • wpf ObservableCollection筛选功能
    viewmodel中定义原始数据及筛选后的数据,筛选后的数据类型为ICollectionView//原始数据列表publicObservableCollection<SchoolOutDto>SchoolList{get;set;}///<summary>///筛选数据后的列表///</summary>publicICollectionViewFilterSchoolList{get;set;}......
  • 数据设计模式一般很抽象
      Java的设计模式和其他语言的编程开发设计模式通用。设计模式分为架构模式和程序开发的设计模式。系统的架构模式分为CS架构和BS架构。单机版本的系统架构模式是继承与C/C++的开发项目软件。C/C++擅长技术的底层实现。驱动软件和操作系统也是应用程序。基于操作系统可以运......
  • 设计模式与非设计模式什么情况下使用
    一、特点    1、设计模式:        a、经验总结:                        设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上。        b、可读性‌:              ......
  • 设计模式:异步处理文件常用设计模式
    引言在java中,基于系统系统性能考虑,大文件导入和导出大多采用异步模式。那么如何设计既不会造成代码冗余也有利于后续更好的扩展呢?以下将介绍三种不同的设计方案:正文1.工厂模式+模板方法模式1.1.设计思路使用工厂模式创建不同的文件导入处理器(如CSV导入、Excel导......
  • c#代码介绍23种设计模式_12亨元模式
    目录1、享元模式的实现精髓2、享元模式的正式定义3、亨元模式实现4、涉及的角色如下几种角色5、享元模式的优缺点6、使用场景7、实现思路在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内......
  • c#代码介绍23种设计模式_13代理模式
    目录1、代理模式的详细介绍2、代理模式定义3、代理模式实现4、代理模式所涉及的角色5、代理模式的优缺点6、实现思路在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可......
  • 技术成神之路:设计模式(十九)桥接模式
    介绍桥接模式(BridgePattern)是一种结构型设计模式,通过将抽象部分与它的实现部分分离,使它们都能够独立地变化。它的核心思想是将接口与实现解耦,从而使得两者可以独立地变化。1.定义桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。2.主要作用解耦:桥接模式通过将抽象......
  • 设计模式之备忘录模式
    备忘录模式备忘录模式是一种行为设计模式,它允许保存和恢复对象的内部状态,而无需暴露该对象的实现细节。这种模式在实现撤销操作或是需要保存和恢复数据的场景中非常有用。核心组件备忘录模式主要包含三个角色:发起人(Originator):负责创建一个含有其当前内部状态的备忘录,并可以使......