国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

觀察者模式的實際應用

開發 架構
設計模式不管是在面試還是工作中都會遇到,但我經常碰到小伙伴抱怨實際工作中自己應用設計模式的機會非常小。

[[421875]]

本文轉載自微信公眾號「crossoverJie」,作者crossoverJie。轉載本文請聯系crossoverJie公眾號。

前言

設計模式不管是在面試還是工作中都會遇到,但我經常碰到小伙伴抱怨實際工作中自己應用設計模式的機會非常小。

正好最近工作中遇到一個用觀察者模式解決問題的場景,和大家一起分享。

背景如下:

在用戶創建完訂單的標準流程中需要做額外一些事情:

同時這些業務也是不固定的,隨時會根據業務發展增加、修改邏輯。

如果直接將邏輯寫在下單業務中,這一”坨“不是很核心的業務就會占據的越來越多,修改時還有可能影響到正常的下單流程。

當然也有其他方案,比如可以啟動幾個定時任務,定期掃描掃描訂單然后實現自己的業務邏輯;但這樣會浪費許多不必要的請求。

觀察者模式

因此觀察者模式就應運而生,它是由事件發布者在自身狀態發生變化時發出通知,由觀察者獲取消息實現業務邏輯。

這樣事件發布者和接收者就可以完全解耦,互不影響;本質上也是對開閉原則的一種實現。

示例代碼

先大體看一下觀察者模式所使用到的接口與關系:

  • 主體接口:定義了注冊實現、循環通知接口。
  • 觀察者接口:定義了接收主體通知的接口。
  • 主體、觀察者接口都可以有多個實現。
  • 業務代碼只需要使用 Subject.Nofity() 接口即可。

接下來看看創建訂單過程中的實現案例。

代碼采用 go 實現,其他語言也是類似。

首先按照上圖定義了兩個接口:

  1. type Subject interface { 
  2.  Register(Observer) 
  3.  Notify(data interface{}) 
  4.  
  5. type Observer interface { 
  6.  Update(data interface{}) 

由于我們這是一個下單的事件,所以定義了 OrderCreateSubject 實現 Subject:

  1. type OrderCreateSubject struct { 
  2.  observerList []Observer 
  3.  
  4. func NewOrderCreate() Subject { 
  5.  return &OrderCreateSubject{} 
  6.  
  7. func (o *OrderCreateSubject) Register(observer Observer) { 
  8.  o.observerList = append(o.observerList, observer) 
  9. func (o *OrderCreateSubject) Notify(data interface{}) { 
  10.  for _, observer := range o.observerList { 
  11.   observer.Update(data) 
  12.  } 

其中的 observerList 切片是用于存放所有訂閱了下單事件的觀察者。

接著便是編寫觀察者業務邏輯了,這里我實現了兩個:

  1. type B1CreateOrder struct { 
  2. func (b *B1CreateOrder) Update(data interface{}) { 
  3.  fmt.Printf("b1.....data %v \n", data) 
  4.  
  5.  
  6. type B2CreateOrder struct { 
  7. func (b *B2CreateOrder) Update(data interface{}) { 
  8.  fmt.Printf("b2.....data %v \n", data) 

使用起來也非常簡單:

  1. func TestObserver(t *testing.T) { 
  2.  create := NewOrderCreate() 
  3.  create.Register(&B1CreateOrder{}) 
  4.  create.Register(&B2CreateOrder{}) 
  5.  
  6.  create.Notify("abc123"

Output:

  1. b1.....data abc123 
  2.  
  3. b2.....data abc123 
  1. 創建一個創建訂單的主體 subject。
  2. 注冊所有的訂閱事件。
  3. 在需要通知處調用 Notify 方法。

這樣一旦我們需要修改各個事件的實現時就不會互相影響,即便是要加入其他實現也是非常容易的:

  1. 編寫實現類。
  2. 注冊進實體。

不會再修改核心流程。

配合容器

其實我們也可以省略掉注冊事件的步驟,那就是使用容器;大致流程如下:

自定義的事件全部注入進容器。

再注冊事件的地方從容器中取出所有的事件,挨個注冊。

這里所使用的容器是 https://github.com/uber-go/dig

修改后的代碼中,每當我們新增一個觀察者(事件訂閱)時,只需要使用容器所提供 Provide 函數注冊進容器即可。

同時為了讓容器能夠支持同一個對象存在多個實例也需要新增部分代碼:

  1. type Observer interface { 
  2.  Update(data interface{}) 
  3. type ( 
  4.  Instance struct { 
  5.   dig.Out 
  6.   Instance Observer `group:"observers"
  7.  } 
  8.  
  9.  InstanceParams struct { 
  10.   dig.In 
  11.   Instances []Observer `group:"observers"
  12.  } 

在 observer 接口中需要新增兩個結構體用于存放同一個接口的多個實例。

group:"observers" 用于聲明是同一個接口。

創建具體觀察者對象時返回 Instance 對象。

  1. func NewB1() Instance { 
  2.  return Instance{ 
  3.   Instance: &B1CreateOrder{}, 
  4.  } 
  5.  
  6. func NewB2() Instance { 
  7.  return Instance{ 
  8.   Instance: &B2CreateOrder{}, 
  9.  } 

其實就是用 Instance 包裝了一次。

這樣在注冊觀察者時,便能從 InstanceParams.Instances 中取出所有的觀察者對象了。

  1. err = c.Invoke(func(subject Subject, params InstanceParams) { 
  2.  for _, instance := range params.Instances { 
  3.   subject.Register(instance) 
  4.  } 
  5. }) 

這樣在使用時直接從容器中獲取主題對象,然后通知即可:

  1. err = c.Invoke(func(subject Subject) { 
  2.  subject.Notify("abc123"
  3. }) 

更多關于 dig 的用法可以參考官方文檔:

https://pkg.go.dev/go.uber.org/dig#hdr-Value_Groups

總結

有經驗的開發者會發現和發布訂閱模式非常類似,當然他們的思路是類似的;我們不用糾結與兩者的差異(面試時除外);學會其中的思路更加重要。

 

責任編輯:武曉燕 來源: crossoverJie
相關推薦

2020-10-26 08:45:39

觀察者模式

2022-01-29 22:12:35

前端模式觀察者

2021-07-08 11:28:43

觀察者模式設計

2013-11-26 17:09:57

Android設計模式

2011-04-29 09:22:22

2024-12-03 09:34:35

觀察者模 式編程Javav

2012-08-27 10:52:20

.NET架構觀察者模式

2021-03-29 07:14:28

Spring觀察者模式

2015-11-25 11:10:45

Javascript設計觀察

2024-02-18 12:36:09

2009-03-30 09:39:04

觀察者思想換位設計模式

2024-06-04 13:11:52

Python行為設計模式開發

2021-01-25 05:38:04

設計原理VueSubject

2021-09-29 19:45:24

觀察者模式Observable

2021-06-03 12:26:28

觀察者模式面試阿里P6

2022-05-09 10:50:13

觀察者模式設計模式

2022-07-13 08:36:57

MQ架構設計模式

2021-06-07 20:03:04

監聽器模式觀察者

2021-04-14 14:40:37

forSpringJava

2022-11-15 07:35:50

Spring事件觀察者模式
點贊
收藏

51CTO技術棧公眾號

www.日本在线视频| 天堂成人在线| 欧美高清日韩| 欧美高清视频免费观看| 亚洲三级欧美| 成人看片黄a免费看在线| 僵尸再翻生在线观看| 亚洲va欧美va人人爽| 黄色三级视频片| 韩国v欧美v日本v亚洲v| 欧美日韩在线一二三| 亚洲xxx拳头交| 国产69久久精品成人| 高清在线一区| 亚洲欧美国内爽妇网| 韩国成人免费视频| 日韩一区二区免费高清| 波多野结衣在线网站| 欧美日韩精品在线观看| www.男人的天堂.com| 国产精品嫩草99a| 91香蕉视频导航| 日本一区二区三级电影在线观看 | 亚洲高清在线| 国产乱码精品一区二区三区日韩精品| 久久久久久久久99精品大| 国产精品黄页免费高清在线观看| 国产欧美三级电影| 欧洲s码亚洲m码精品一区| 欧美亚视频在线中文字幕免费| 欧美丰满片xxx777| 免费精品国产| 亚洲a级在线播放观看| 欧美在线亚洲综合一区| 国产精品福利视频| 麻豆精品新av中文字幕| 91免费国产精品| 久久久影视传媒| 综合激情丁香| 欧美特级www| 视频在线这里都是精品| 亚洲日韩中文字幕在线播放| 国产精品一区二区三区av| 国产69久久精品成人| 欧美在线看片| 中文字幕中文字幕在线中一区高清| 成人精品小蝌蚪| 啊啊啊射了视频网站| 欧美日韩国产成人在线免费| 九九精品调教| 久久av红桃一区二区小说| 综合综合综合综合综合网| 国产伦精品一区二区三区视频黑人 | 三级在线看中文字幕完整版| 亚洲一区www| 久久综合五月婷婷| 成人免费看片网站| 久久99精品久久久| 麻豆传传媒久久久爱| 欧美日韩亚洲国产一区| 鲁鲁在线中文| 日韩美女视频免费在线观看| 久久不射网站| 欧美三级午夜理伦三级富婆| 欧美日韩高清一区| 久久国产精品美女| 国产欧美一区二区在线播放| 99久久精品99国产精品 | 成人精品网站在线观看| 九一久久久久久| 猫咪av永久| 亚洲国产精品大全| 国内精品免费| 亚洲激情啪啪| 亚洲自拍与偷拍| av资源网在线播放| 国产成人精品av| 国产真实乱对白精彩久久| www.xxx黄| 亚洲成人三级在线| 狠狠操综合网| 国产精品999视频| 精品视频色一区| 999久久久久久久久6666| 最新日韩中文字幕| 日本在线视频www| 亚洲三级在线播放| 日本黄色片在线观看| 亚洲性生活视频| 狠狠久久婷婷| 欧美wwwwwww| 日韩欧美色综合网站| 羞羞色国产精品网站| 久久国产高清| 久久精品亚洲一区二区三区浴池| 国产在线小视频| 久久精品视频网站| 国产精品美女| 成年人视频网站| 国产手机视频精品| 欧美激情91| 国产无遮挡又黄又爽免费网站| 日韩精品极品毛片系列视频| 欧美在线亚洲| 丁香激情视频| 久久精品国产清自在天天线 | 日韩激情在线视频| 合欧美一区二区三区| 免费特级黄毛片| 欧美日韩福利电影| 国产一区二区美女诱惑| 天堂成人在线| 777精品视频| 久久伊99综合婷婷久久伊| www.51av欧美视频| 精品1区2区| 色综合 综合色| 色一区二区三区四区| 中文字幕av专区| 色黄久久久久久| 国产高清成人在线| 电影亚洲精品噜噜在线观看| 国产精品av一区| 亚洲成人激情av| 综合国产视频| 超碰超碰97| 欧美综合在线观看| 99精品热视频| 电影中文字幕一区二区| 浮妇高潮喷白浆视频| 日韩h在线观看| 蜜臀av性久久久久蜜臀av麻豆| 免费在线国产| 91九色单男在线观看| 亚洲第一久久影院| 美女少妇全过程你懂的久久| 97影院理论午夜| 国产精品久久久精品| 亚洲欧洲美洲综合色网| 超碰精品在线观看| 欧美xx网站| 成人激情视频在线播放| 色婷婷综合激情| 欧美日韩视频| www免费网站在线观看| 日本亚洲欧洲精品| 欧美mv和日韩mv国产网站| 久久久精品五月天| av在线不卡免费| 尤物一区二区三区| 亚洲欧美综合v| 91老司机福利 在线| 成人av综合网| 久久黄色免费看| 欧美精品videos另类日本| 久久久久久久av麻豆果冻| 欧美日韩导航| 男女18免费网站视频| 成人欧美一区二区三区在线观看| 色婷婷综合久久久中文字幕| 99成人免费视频| 成人性生活视频| 不卡av免费在线| 91精品免费看| 亚洲精品xxxx| 国产精品乱码一区二区三区软件| 久久国产小视频| av免费网站在线观看| 久久精品无码中文字幕| 7m精品福利视频导航| 在线观看免费成人| 美洲天堂一区二卡三卡四卡视频| av日韩久久| 欧洲亚洲精品视频| 亚洲精品中文字幕在线| 欧美成人激情在线| 国产亚洲精品aa| 中文字幕一区二区三区日韩精品 | 色婷婷av一区| 日韩av成人高清| 国产成人毛片| 香蕉网站在线| 国产 国语对白 露脸| 26uuu亚洲伊人春色| 欧美日韩视频专区在线播放| 成人激情小说乱人伦| 亚洲影视一区| 香蕉视频亚洲一级| 亚洲男男gay视频| 亚洲欧美日韩不卡一区二区三区| 欧美国产日韩xxxxx| 欧美蜜桃一区二区三区| 91美女精品福利| 国产精品五区| 国产精品45p| aaa大片在线观看| 欧美 日韩 国产一区| 97伦理在线四区| 欧美成人免费在线观看| 欧美一区二区三区免费大片 |