【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

这篇具有很好参考价值的文章主要介绍了【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

观察者模式(Observer Pattern)是一种行为型模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

观察者模式使用三个类Subject、Observer和Client。Subject对象带有绑定观察者到Client对象和从Client对象解绑观察者的方法。我们创建Subject类、Observer抽象类和扩展了抽象类Observer的实体类。

作用

  1. 一个对象状态更新,其他依赖对象收到通知和自动更新的机制。
  2. 实现模块化分离,实现主题与观察者交互对象之间的松耦合。
    1)观察者定义了对象之间一对多的关系。
    2)被观察者(主题)用一个共同的接口来更新观察者。
    3)观察者和被观察者用松耦合方式结合,被观察者不知道观察者的细节,只知道观察者实现了观察者接口。

实现步骤

  1. 创建观察者observer基础接口,包含主题和更新方法
  2. 创建主题subject抽象类,包含observer列表以及添加和删除方法
  3. 创建具体的主题类,实现通知方法,发布通知时轮询通知全部观察者
  4. 创建多个具体观察者,与主题关联,并实现自己的更新方法
  5. 客户调用时先声明主题,再将观察者分别添加到主题,当主题发布通知时,观察者自动更新

UML

 【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

 

Java代码

观察者接口

// ObserverAPI.java 观察者接口,Java 9已经默认支持Observer接口
// 这里避免冲突采取ObserverAPI命名
public interface ObserverAPI {
   public Subject subject = null;
   public void update(String content);
}

具体观察者

// ConcreteObserver.java 具体的观察者实现类,也可以看成订阅者,关联对应的主题类。
// 不同的观察者也可以对应多个主题
public class ConcreteObserver implements ObserverAPI {

   public Subject subject;

   // 给观察者绑定主题,同时把观察者添加到主题列表
   public ConcreteObserver(Subject subject) {
      this.subject = subject;
      this.subject.register((ObserverAPI) this);
   }

   // 观察者发出更新通知,不用单独告诉订阅者,由订阅者自行监听
   public void update(String content) {
      System.out.println(String.format("%s::update() [subject.name = %s content = %s]",
            this.getClass().getName(),
            this.subject.getName(), content));
   }
}
// ConcreteObserver2.java 具体的观察者实现类,也可以看成订阅者,关联对应的主题类。
// 不同的观察者可以对应不同的主题。
public class ConcreteObserver2 implements ObserverAPI {

  // 这里没有在构造器就绑定某个主题,而是从客户角度去注册观察者
  public ConcreteObserver2() {
  }

  // 观察者发出更新通知,观察者自行监听
  public void update(String content) {
    System.out.println(String.format("%s::update() [content = %s]",
        this.getClass().getName(), content));
  }
}

抽象主题类

// Subject.java 定义抽象主题类或者接口,供具体主题类继承
public abstract class Subject {
   private String name;
   // protected Set<ObserverAPI> observers = new HashSet<>();
   protected List<ObserverAPI> observers = new ArrayList<>();

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public void register(ObserverAPI observer) {
      System.out.println(this.getClass().getName() + "::register() [observer = " + observer.getClass().getSimpleName() + "]");
      observers.add(observer);
   }

   public void remove(ObserverAPI observer) {
      observers.remove(observer);
   }

   // 通知由具体类来实现逻辑
   public abstract void notify(String name);
}

具体主题类

// ConcreteSubject.java 观察者主题类,也是发布者,重写具体的通知方法。不同主题可以关联不同的观察者。
public class ConcreteSubject extends Subject {

   public ConcreteSubject(String name) {
      this.setName(name);
   }

   // 不同的主题类有自己的通知方法,批量通知绑定的观察者
   @Override
   public void notify(String content) {
      System.out.println(this.getClass().getName() + "::notify() [content = " + content + "]");
      for (Object observer : this.observers) {
         ((ObserverAPI) observer).update(content);
      }

   }

}

测试调用

    /**
     * 观察者模式应用非常广泛,主要是观察者提前绑定到发布者
     * 当发布者发布消息时,批量广播通知,而无需逐一通知
     * 观察者监听到消息后自己决定采取哪一种行为
     */

    // 定义一个主题,也就是发布者
    Subject concreteSubject = new ConcreteSubject("subject1");
    // 再声明观察者,通过构造器注册到主题上
    ObserverAPI observer1 = new ConcreteObserver(concreteSubject);

    // 也可以单独给主题注册一个新的观察者
    concreteSubject.register(new ConcreteObserver2());
    // 可以移除观察者对象,可以打开注释试下
    // concreteSubject.remove(observer1);

    // 主题开始发布新通知,各观察者自动更新
    concreteSubject.notify("hello, this is broadcast.");

Python代码

观察者接口

# ObserverAPI.py 观察者抽象父类,定义一些公共方法
class ObserverAPI:

    def __init__(self, name):
        self.name = name

    # 观察者发出更新通知,观察者自行监听
    def update(self, content):
        print(self.__class__.__name__ + '::update() [content = ' + content + ']')

    def set_name(self, name):
        self.name = name

具体观察者

# ConcreteObserver.py 具体的观察者实现类,也可以看成订阅者,关联对应的主题类。
# 不同的观察者也可以对应多个主题
from src.ObserverAPI import ObserverAPI

# 具体的观察者实现类,也可以看成订阅者,关联对应的主题类。
# 不同的观察者也可以对应多个主题


class ConcreteObserver(ObserverAPI):
    # 给观察者绑定主题,同时把观察者添加到主题列表
    def __init__(self, subject, name):
        ObserverAPI.__init__(self, name)
        
        # python3支持的父类调用
        # super(ConcreteObserver, self).__init__(name)
        # super().__init__(name)

        self.subject = subject
        subject.register(self)

    # 观察者发出更新通知,不用单独告诉订阅者,由订阅者自行监听
    def update(self, content):
        print(self.__class__.__name__ + '::update() [subject.name = ' +
              self.subject.name + ' content = ' + content + ']')
# ConcreteObserver2.py 具体的观察者实现类,也可以看成订阅者,关联对应的主题类。
# 不同的观察者可以对应不同的主题。
from src.ObserverAPI import ObserverAPI


# 具体的观察者实现类,也可以看成订阅者,关联对应的主题类。
# 不同的观察者可以对应不同的主题。
class ConcreteObserver2(ObserverAPI):
    # 这里没有在构造器就绑定某个主题,而是从客户角度去注册观察者
    # 观察者发出更新通知,观察者自行监听

    # def update(self, content):
    #     print(self.__class__.__name__ + '::update() [content = ' + content +']')
    
    pass

抽象主题类

# Subject.py 定义抽象主题类或者接口,供具体主题类继承
class Subject:

    def __init__(self, name):
        self.name = name
        self.observers = []

    def get_name(self):
        return self.name

    def set_name(self, name):
        self.name = name

    def register(self, observer):
        print(self.__class__.__name__ + '::register() [observer = ' +
              observer.__class__.__name__ + ']')

        self.observers.append(observer)

    def remove(self, observer):
        self.observers.remove(observer)

    # 通知由具体类来实现逻辑
    def notify(self, name):
        pass

具体主题类

// ConcreteSubject.py 观察者主题类,也是发布者,重写具体的通知方法。不同主题可以关联不同的观察者。
from src.Subject import Subject


# 观察者主题类,也是发布者,重写具体的通知方法。不同主题可以关联不同的观察者。
class ConcreteSubject(Subject):
    # 不同的主题类有自己的通知方法,批量通知绑定的观察者
    def notify(self, content):
        print(self.__class__.__name__ + '::notify() [content = ' + content +
              ']')
        for observer in self.observers:
            observer.update(content)

测试调用

import sys
import os

os_path = os.getcwd()
sys.path.append(os_path)

from src.ConcreteSubject import ConcreteSubject
from src.ConcreteObserver import ConcreteObserver
from src.ConcreteObserver2 import ConcreteObserver2


def test():
    '''
    * 观察者模式应用非常广泛,主要是观察者提前绑定到发布者
    * 当发布者发布消息时,批量广播通知,而无需逐一通知
    * 观察者监听到消息后自己决定采取哪一种行为
    '''

    # 定义一个主题,也就是发布者
    concrete_subject = ConcreteSubject('subject1')
    # 再声明观察者,通过构造器注册到主题上
    observer1 = ConcreteObserver(concrete_subject, 'observer1')
    # 也可以单独给主题注册一个新的观察者
    observer2 = ConcreteObserver2('observer2')
    concrete_subject.register(observer2)
    # 可以移除观察者对象
    # concrete_subject.remove(observer1)

    # 主题开始发布新通知,各观察者自动更新
    concrete_subject.notify('hello, this is broadcast.')


if __name__ == '__main__':
    print(__file__)
    print("test start:")
    test()

更多语言版本

不同语言实现设计模式:https://github.com/microwind/design-pattern文章来源地址https://www.toymoban.com/news/detail-420424.html

到了这里,关于【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • java设计模式学习之【观察者模式】

    java设计模式学习之【观察者模式】

    想象你在一个在线拍卖会上竞标一件珍贵的艺术品。每当有人出价更高,系统都会立即通知你。这个实时更新机制使你可以做出快速反应。这种模式,在软件开发中称为观察者模式,是一种广泛应用于实现事件驱动系统的设计模式。 观察者模式(Observer Pattern)是一种行为型

    2024年02月03日
    浏览(9)
  • 【设计模式】第十二章:观察者模式详解及应用案例

    【设计模式】第十二章:观察者模式详解及应用案例

    【设计模式】七大设计原则 【设计模式】第一章:单例模式 【设计模式】第二章:工厂模式 【设计模式】第三章:建造者模式 【设计模式】第四章:原型模式 【设计模式】第五章:适配器模式 【设计模式】第六章:装饰器模式 【设计模式】第七章:代理模式 【设计模式

    2024年02月13日
    浏览(15)
  • java设计模式-观察者模式(jdk内置)

    上一篇我们学习了 观察者模式。 观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。 下面我们不多说明,直接示例代码,例子依然同 观察者模式篇章,建议先去看看。

    2024年02月15日
    浏览(8)
  • Java设计模式-观察者模式-SpringBoot实现

    Java设计模式-观察者模式-SpringBoot实现

    项目:https://gitee.com/KakarottoChen/blog-code.git 的:JavaSpringListener Java观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。在观察者模式中,当一个对象的状态发生变化时,它的所有依赖对象(观察者)都会自动收到通知并进行相应的更新。 观察者模式由以下几个核

    2024年02月08日
    浏览(37)
  • Java设计模式系列--观察者模式写法2:JDK

    Java设计模式系列--观察者模式写法2:JDK

    原文网址:Java设计模式系列--观察者模式写法2:JDK_IT利刃出鞘的博客-CSDN博客 说明 本文用示例介绍观察者模式的一种写法:JDK。 JDK的观察者模式简介 在 Java 中,java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现这两个接口就可以编写观察者模式。 1. Ob

    2024年02月13日
    浏览(8)
  • 【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    有一个天气预报项目,需求如下: 气象站可以将每天测量到的温度、湿度、气压等等以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度、气压、湿度的接口 测量数据更新时,要能实时的通知给第三

    2024年02月14日
    浏览(9)
  • 设计模式:观察者模式

    定义 观察者模式(Observer Pattern)是一种行为设计模式,允许一个对象(称为“主题”或“可观察对象”)维护一组依赖于它的对象(称为“观察者”),当主题的状态发生变化时,会自动通知所有观察者对象。 应用场景 观察者模式适用于以下场景: 联动反应 :当一个对象

    2024年04月08日
    浏览(13)
  • 设计模式-观察者模式

    观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者

    2024年02月15日
    浏览(9)
  • 设计模式---观察者模式

    1,概念         属于行为模式的一种,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一对象主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),

    2024年02月15日
    浏览(8)
  • 设计模式——观察者模式

    设计模式——观察者模式

    观察者模式可以分为观察者和被观察者,观察者通过注册到一个被观察者中,也可视为订阅,当被观察者的数据发生改变时,会通知到观察者,观察者可以据此做出反应。 可以类比订阅报纸,报社就是被观察者,订阅者就是观察者,订阅者通过订阅报纸与报社建立联系,而报

    2024年02月15日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包