Go设计模式之观察者模式讲解和代码示例

 更新时间:2023年07月17日 08:16:54   作者:demo007x  
观察者是一种行为设计模式, 允许一个对象将其状态的改变通知其他对象,观察者模式提供了一种作用于任何实现了订阅者接口的对象的机制, 可对其事件进行订阅和取消订阅,本文就通过代码示例给大家详细介绍一下Go的观察者模式,需要的朋友可以参考下

概念示例

在电商网站中, 商品时不时地会出现缺货情况。 可能会有客户对于缺货的特定商品表现出兴趣。 这一问题有三种解决方案:

  • 客户以一定的频率查看商品的可用性。
  • 电商网站向客户发送有库存的所有新商品。
  • 客户只订阅其感兴趣的特定商品, 商品可用时便会收到通知。 同时, 多名客户也可订阅同一款产品。

选项 3 是最具可行性的, 这其实就是观察者模式的思想。 观察者模式的主要组成部分有:

  • 会在有任何事发生时发布事件的主体。
  • 订阅了主体事件并会在事件发生时收到通知的观察者。

subject.go: 主体

package main
type Subject interface {
	register(observer Observer)
	deregister(obs Observer)
	notifyAll()
}

item.go: 具体主体

package main
import (
	"fmt"
)
type Item struct {
	observerList []Observer // 多个观察者
	name         string
	inStock      bool // 有库存
}
func newItem(name string) *Item {
	return &Item{
		name:    name,
		inStock: false,
	}
}
// 更新状态
func (i *Item) updateAvailability() {
	fmt.Printf("Item %s is now in stock \n", i.name)
	i.inStock = true // 更新状态,有库存 s
	i.notifyAll()
}
func (i *Item) register(o Observer) {
	i.observerList = append(i.observerList, o)
}
func (i *Item) deregister(o Observer) {
	i.observerList = removeFromslice(i.observerList, o)
}
func (i *Item) notifyAll() {
	for _, v := range i.observerList {
		v.update(i.name)
	}
}
func removeFromslice(observerList []Observer, observerToRemove Observer) []Observer {
	observerListLength := len(observerList)
	for i, observer := range observerList {
		if observerToRemove.getID() == observer.getID() {
			observerList[observerListLength-1], observerList[i] = observerList[i], observerList[observerListLength-1]
			return observerList[:observerListLength-1]
		}
	}
	return observerList
}

observer.go: 观察者

package main
type Observer interface {
	update(string)
	getID() string
}

customer.go: 具体观察者

package main
import "fmt"
type Customer struct {
	id string
}
func (c *Customer) getID() string {
	return c.id
}
func (c *Customer) update(iteName string) {
	fmt.Printf("Sendint email to customer %s for item %s\n", c.id, iteName)
}

main.go: 客户端代码

package main
func main() {
	shirtItem := newItem("Nick Shirt")
	observerFirst := &Customer{
		id: "abc@gmail.com",
	}
	observerSecond := &Customer{
		id: "def@gmail.com",
	}
	shirtItem.register(observerFirst)
	shirtItem.register(observerSecond)
	shirtItem.updateAvailability()
}

output.txt: 执行结果

Item Nick Shirt is now in stock 
Sendint email to customer abc@gmail.com for item Nick Shirt
Sendint email to customer def@gmail.com for item Nick Shirt

到此这篇关于Go设计模式之观察者模式讲解和代码示例的文章就介绍到这了,更多相关Go观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang对自定义类型进行排序的解决方法

    golang对自定义类型进行排序的解决方法

    学习一门编程语言,要掌握原子数据类型,还需要掌握自定义数据类型。下面这篇文章主要给大家介绍了关于golang如何对自定义类型进行排序的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-12-12
  • 详解Go开发Struct转换成map两种方式比较

    详解Go开发Struct转换成map两种方式比较

    本篇文章主要介绍了详解Go开发Struct转换成map两种方式比较,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 基于Go Int转string几种方式性能测试

    基于Go Int转string几种方式性能测试

    这篇文章主要介绍了Go Int转string几种方式测试,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言中OCR常用识别库的使用与实战指南

    Go语言中OCR常用识别库的使用与实战指南

    Go 生态里没有像 Python 那样大量直接内置 OCR 模型的库,但可以通过调用成熟 OCR 引擎(Tesseract)、用 OpenCV 做预处理、或接入云 OCR 服务来构建稳定的 OCR 流水线,本文把常见方案、优缺点、实战代码与工程级建议都列出来,需要的可以了解下
    2025-11-11
  • Go高级特性探究之稳定排序详解

    Go高级特性探究之稳定排序详解

    Go 语言提供了 sort 包,其中最常用的一种是 sort.Slice() 函数,本篇文章将为大家介绍如何使用 sort.SliceStable() 对结构体数组的某个字段进行稳定排序,感兴趣的可以了解一下
    2023-06-06
  • Golang语言如何读取http.Request中body的内容

    Golang语言如何读取http.Request中body的内容

    这篇文章主要介绍了Golang语言如何读取http.Request中body的内容问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Golang内存管理之内存逃逸分析

    Golang内存管理之内存逃逸分析

    逃逸分析是指由编译器决定内存分配的位置,不需要程序员指定,这篇文章主要为大家详细介绍了Golang中内存逃逸分析的几种方法,需要的可以参考一下
    2023-07-07
  • Golang中由零值和gob库特性引起BUG解析

    Golang中由零值和gob库特性引起BUG解析

    这篇文章主要为大家介绍了Golang中由零值和gob库特性引起BUG解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Golang中crypto/cipher加密标准库全面指南

    Golang中crypto/cipher加密标准库全面指南

    本文主要介绍了Golang中crypto/cipher加密标准库,包括对称加密、非对称加密以及使用流加密和块加密算法,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • GO使用Mutex确保并发程序正确性详解

    GO使用Mutex确保并发程序正确性详解

    这篇文章主要为大家介绍了GO使用Mutex确保并发程序正确性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论