首页 > 其他分享 >golang实现设计模式之观察者模式-优缺点,适用场景

golang实现设计模式之观察者模式-优缺点,适用场景

时间:2023-06-09 18:22:43浏览次数:49  
标签:订阅 subs iSub 优缺点 golang notify func 设计模式 name

观察者模式是一种行为型模式,其定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。

观察者模式常用 订阅/发布机制,即发布者持有所有订阅者,当发布者状态变更或者特定行为时,通知所有订阅者。

结构

  • 1.发布者。属性及行为:属性,订阅者列表,行为,添加、删除订阅者方法,在自身状态改变或特定行为发生时通知订阅者。
  • 2.抽象订阅者,声明update更新方法。
  • 3.具体订阅者,通知时执行方法。
  • 4.客户端,分别创建发布者订阅者对象,并且为发布者添加订阅者对象。

优缺点

  • 优点

1.开闭原则。无需修改发布者代码就能引入新的订阅者类。
2.可以在运行时建立对象之间的联系。

  • 缺点

1.订阅者的通知顺序是随机的。
个人理解,如果订阅者是列表,执行通知 Notify() 是遍历列表的话,应该有顺序

适用场景

  • 1.当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的时。
  • 2.当应用中的一些对象必须观察其他对象时, 可使用该模式。

代码实现

package main

import "fmt"

// 1.publisher
type iPublish interface {
   register(s iSub)
   remove(s iSub)
   notify()
}

type pub struct {
   name string
   inStock bool
   subs []iSub
}

func NewPub(name string) *pub {
   return &pub{name: name}
}

func (r *pub) register(s iSub)  {
   r.subs = append(r.subs, s)
}

func (r *pub) remove(s iSub)  {
   if len(r.subs) == 0 {
      return
   }

   for i := 0; i < len(r.subs); i++ {
      if r.subs[i] == s {
         r.subs = append(r.subs[:i], r.subs[i+1:]...)
      }
   }
}

func (r *pub) notify()  {
   if len(r.subs) == 0 {
      return
   }
   for i := 0; i < len(r.subs); i++ {
      r.subs[i].update()
   }
}

// 2.abstract subscribe
type iSub interface {
   update()
}

// 3.concrete subscribe
type subSports struct {
   name string
}

func (r *subSports) update()  {
   fmt.Printf("sub-sports %s received notify.\n", r.name)
}

type subFood struct {
   name string
}

func (r *subFood) update()  {
   fmt.Printf("sub-food %s received notify.\n", r.name)
}

type subDigits struct {
   name string
}

func (r *subDigits) update()  {
   fmt.Printf("sub-digits %s received notify.\n", r.name)
}

// 4.client
func main()  {
   p := NewPub("shopping")
   p.register(&subSports{"Anta"})
   p.register(&subFood{"Pepsi"})
   p.register(&subSports{"Apple"})
   p.notify()
}

参考文章:

标签:订阅,subs,iSub,优缺点,golang,notify,func,设计模式,name
From: https://www.cnblogs.com/davis12/p/17469990.html

相关文章

  • golang实现设计模式之模板模式-优缺点,适用场景
    模板模式是一种行为型设计模式,其定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。特点1.算法结构已确定。2.具体实现交由子类实现。结构1.抽象类(AbstractClass)。算法步骤可以被声明为抽......
  • 基于网卡地址做设备指纹的优缺点
    生成设备指纹的目的是为了能唯一地标识设备,而且这个标识在设备的生命周期内保持稳定。因此,在选择设备特征时,通常需要考虑这些特征的唯一性和稳定性。软件及配置信息一版不适合,是因为这类变化虽然不大,但万一变化后,设备指纹会变,影响使用。比如:操作系统信息:操作系统版本、安装日......
  • 4月29日邓老师设计模式面试资料 一般有用 看1
    【金三银四】设计模式篇1.谈谈你对设计模式的理解1.首先谈设计模式的作用:经验的传承,提高了软件复用的水平,最终达到提高软件开发效率设计原则简单说明单一职责一个类只负责一项职责里氏替换原则子类可以扩展父类的功能,但不能改变父类原有的功能依赖倒置原则要依......
  • 9.3 模版设计模式
    抽象类的设计应该是比类更高一层的设计。抽象类最大好处:1.对子类方法对统一管理;2.可以自身提供有一些普通方法,并且这些普通方法可以调用抽象方法(这些抽象方法必须在有子类提供实现的时候才会生效)abstractclassAction{ //定义公共行为类 publicstaticfinal......
  • Golang 配置代理
    通过 goget 命令下载各种依赖时,经常需要访问github/google等网站。配置好代理后,可以快速稳定的访问。常用的go代理goproxyhttps://goproxy.io/zh/阿里云https://mirrors.aliyun.com/goproxy/七牛云https://goproxy.cn设置go代理go1.13及以上版本可以直接用下面......
  • 性能测试-第01天-从理解到体验,最后能够对比说出Loadrunner和JMeter的优缺点
    更多功能测试以及全套学习路线图均在专栏,↑↑戳进去领取~系列文章目录......
  • 序) 设计模式参考资料
    https://sourcemaking.com/design_patternshttp://javapapers.com/design-patterns/  DesignPatternsInsoftwareengineering,a designpattern isageneralrepeatablesolutiontoacommonlyoccurringprobleminsoftwaredesign.Adesignpatternisn't......
  • Golang之Reflect包
    Golang之Reflect什么是Golang的Reflect包?Golang的Reflect包(reflect)是一个强大的内置包,它提供了在运行时进行程序反射的功能。通过使用Reflect包,我们可以在不了解类型的情况下,动态地检查变量的类型、调用函数和方法,以及修改变量的值。为什么使用Golang的Reflect包?Golang的Reflec......
  • 设计模式系列 | 建造者模式
    很多人也都听说过建造者设计模式,但总是对这个设计模式理解得不够透彻,今天我们就来聊聊建造者设计模式。另外也说说建造者设计模式和工厂模式的区别。定义其实建造者设计模式的定义,很多事看不懂的,也是记不住的,但我们还是得先来看看是如何定义的。TheintentoftheBuilderdesignp......
  • 转载:Spring 框架的设计理念与设计模式分析
    Spring框架的设计理念与设计模式分析<!--LEADSPACE_BODY_END--><!--SUMMARY_BEGIN-->Spring作为现在最优秀的框架之一,已被广泛的使用,并且有很多对其分析的文章。本文将从另外一个视角试图剖析出Spring框架的作者设计Spring框架的骨骼架构的设计理念,有那几个核心组件?为......