精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

觀察者模式的實際應用

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

[[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-06-03 12:26:28

觀察者模式面試阿里P6

2021-09-29 19:45:24

觀察者模式Observable

2022-07-13 08:36:57

MQ架構設計模式

2022-05-09 10:50:13

觀察者模式設計模式

2021-06-07 20:03:04

監聽器模式觀察者

2021-04-14 14:40:37

forSpringJava

2021-03-30 15:30:44

鴻蒙HarmonyOS應用開發
點贊
收藏

51CTO技術棧公眾號

国产精品186在线观看在线播放| 波多野结衣激情视频| 国产精品久久久久久久久久白浆 | 亚洲国产精品一区二区久| 尤物av无码色av无码| 阿v免费在线观看| 国产精品资源网站| 欧美亚洲在线视频| 小泽玛利亚一区二区免费| 成午夜精品一区二区三区软件| 欧美午夜性色大片在线观看| 在线天堂一区av电影| 污视频在线免费观看| 麻豆国产精品官网| 91高清视频在线免费观看| 国产午夜精品久久久久久久久| 亚洲国产精品免费视频| 欧美色图在线观看| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 欧洲美女少妇精品| 久久久高清一区二区三区| 91在线免费看片| 中文字幕丰满人伦在线| 亚洲青色在线| 久久99国产综合精品女同| 一区二区三区伦理片| 红杏aⅴ成人免费视频| 欧美人妖巨大在线| 欧美两根一起进3p做受视频| 免费在线中文字幕| 中文字幕一区二区在线播放| 亚洲综合日韩在线| 中文字幕乱码中文字幕| 久久国产毛片| 欧美亚洲免费电影| 日韩无码精品一区二区三区| 欧美精品日韩| 久久亚洲精品一区二区| 国产7777777| 国产精品视频一区二区三区四蜜臂| 亚洲а∨天堂久久精品喷水| 91人妻一区二区三区| 亚洲精品大片| 欧美日韩亚洲综合一区二区三区| 波多野结衣家庭教师视频| 国产羞羞视频在线播放| 亚洲精品视频在线观看网站| 超碰成人在线免费观看| 最新av网站在线观看| 久久久亚洲精品一区二区三区| 激情五月综合色婷婷一区二区| 国产富婆一级全黄大片| 国内成人免费视频| 91日韩久久| 亚洲AV无码成人片在线观看| 国产成人亚洲综合a∨婷婷| 91在线观看欧美日韩| 国产美女免费看| 国产毛片一区二区| 91丨九色丨国产| 亚洲精品一级片| 成人激情校园春色| 精品视频一区二区| 裸体xxxx视频在线| 欧美韩国日本不卡| 日韩偷拍一区二区| 天堂地址在线www| 亚洲视频一区在线| 国产精品啪啪啪视频| 亚洲按摩av| 精品国产91久久久久久| 116极品美女午夜一级| 欧美日韩123区| 欧美日韩一区三区| 午夜不卡福利视频| 91综合久久爱com| 日韩风俗一区 二区| 美女被到爽高潮视频| 日韩精品影视| 欧美精品videos另类日本| 国产 欧美 日韩 在线| 久久成人国产| 亚洲va久久久噜噜噜久久天堂| 高清毛片aaaaaaaaa片| 久久综合五月天婷婷伊人| 色综合久久av| 免费在线看污片| 色婷婷狠狠综合| 亚洲综合激情视频| 国内精品麻豆美女在线播放视频 | 久久av二区| av播放在线观看| 一区二区三区加勒比av| 久久精品免费一区二区| 深夜日韩欧美| 亚洲精品国产综合区久久久久久久 | 久久免费播放视频| 视频一区在线视频| 亚洲综合最新在线| 免费人成在线观看网站| 亚洲欧美日韩在线| 日韩中文字幕二区| 91亚洲精品视频在线观看| 亚洲最新av网址| 国产精品111| 蜜桃视频免费观看一区| 精品无人乱码一区二区三区的优势| 高清在线观看av| 亚洲图片一区二区| 天天做天天干天天操| 精品中文一区| 久久青草精品视频免费观看| 一级特黄录像免费看| 2014亚洲片线观看视频免费| 第九区2中文字幕| 成人国产激情| 亚洲裸体xxxx| 日韩欧美亚洲视频| 国产精品一区二区在线播放 | 色88888久久久久久影院野外| 亚洲天堂小视频| 色综合天天综合网中文字幕| 欧美在线观看视频| 日韩在线观看视频网站| 亚洲免费观看视频| 久久久精品高清| 日韩久久电影| 国产精品电影网| 九色视频在线观看免费播放| 午夜在线电影亚洲一区| 国产sm在线观看| 99久久综合| 国产精品视频区1| 久久av少妇| 色88888久久久久久影院野外| 国产不卡一二三| 国精品一区二区| 不卡的av一区| 性欧美ⅴideo另类hd| 91精品国产色综合久久久蜜香臀| 91狠狠综合久久久久久| 日韩1区2区日韩1区2区| 日韩精品一线二线三线| 天天免费亚洲黑人免费| 亚洲精选中文字幕| 一级成人黄色片| 久久综合色婷婷| av观看免费在线| 免费成人高清在线视频theav| 992tv成人免费影院| 欧洲成人一区二区三区| 亚洲高清视频在线| 精品一区二区三区四区五区六区| 国产精品观看| 国产精品一区在线播放| 欧美日韩在线观看首页| 亚洲激情国产精品| 亚洲高清毛片一区二区| 国产亚洲精品aa| 国产又黄又猛的视频| 欧美成人一品| 国内精品视频免费| 中文字幕高清在线播放| 亚洲图片制服诱惑| 亚洲最大成人在线视频| 亚洲柠檬福利资源导航| 亚洲熟女一区二区三区| 99国产精品私拍| 日本精品一区二区三区视频| 四虎精品永久免费| 欧美高清在线观看| 三区在线视频| 欧美久久久影院| 久久久久久久中文字幕| www.一区二区| 午夜视频在线瓜伦| 91精品天堂福利在线观看| 国产精品theporn88| 在线女人免费视频| 日韩性xxxx爱| 婷婷丁香花五月天| 欧美在线免费视屏| 免费视频一二三区| 国产亚洲一区字幕| 巨乳女教师的诱惑| 久久在线精品| 日韩一二区视频| 亚洲系列另类av| 亚洲专区中文字幕| 日韩电影av| 久久综合久久美利坚合众国| 香蕉久久国产av一区二区| 欧美日韩在线三级| 国产无套在线观看| 中文字幕在线一区| 黄色工厂在线观看| 国产一区二区三区四区五区美女 | 精品一区二区三区香蕉蜜桃| 人妻夜夜添夜夜无码av| 日韩精品看片| 久久大香伊蕉在人线观看热2| 久久人人视频| 欧美亚洲视频一区二区| 伊人影院蕉久影院在线播放| 亚洲男女性事视频| 高清乱码毛片入口| 欧美电影影音先锋| 波多野结衣人妻| 午夜视频一区在线观看| 亚洲色图27p| 久久久久久久久免费| 俄罗斯黄色录像| 精品亚洲国内自在自线福利| 久久9精品区-无套内射无码| 欧美日韩亚洲三区| 伊人av成人| 国产欧美日韩免费观看 | 成人免费av| 蜜桃麻豆www久久国产精品| 伊色综合久久之综合久久| 91精品国产综合久久香蕉最新版 | 极品盗摄国产盗摄合集| 国产欧美日韩不卡| 黄色aaa视频| 91网站黄www| 国产精品入口麻豆| 国产成人aaaa| 免费人成视频在线播放| 国产原创一区二区三区| 网站一区二区三区| 日韩va欧美va亚洲va久久| 麻豆av免费在线| 亚洲欧美成人综合| 亚洲熟妇无码另类久久久| 国产在线不卡| 久久在线中文字幕| 黄色欧美成人| 欧美大黑帍在线播放| 午夜精品电影| 欧美 日韩 国产精品| 中国成人一区| 国产视频在线观看网站| 欧美日韩国产成人精品| 超碰97在线看| 欧美日韩国产高清| www.日本少妇| 99国产精品99久久久久久粉嫩| 亚洲不卡中文字幕无码| 亚洲人成高清| 国产免费黄色av| 久久精品天堂| 三级a三级三级三级a十八发禁止| 日本欧美一区二区三区乱码| 奇米影音第四色| 紧缚捆绑精品一区二区| 宇都宫紫苑在线播放| 成人综合婷婷国产精品久久蜜臀| 理论片大全免费理伦片| 91在线国产福利| 亚洲一区二区自偷自拍| 国产精品你懂的在线| 中国一级片在线观看| 亚洲黄色免费电影| 久久久久久久久久影院| 色一区在线观看| 亚洲一区二区三区高清视频| 日韩一区二区三区免费看| 亚洲欧美激情国产综合久久久| 亚洲成年人影院在线| 九色视频在线观看免费播放 | 天堂av资源在线观看| 国内精品免费午夜毛片| 成人欧美大片| 成人av资源在线播放| 草草视频在线一区二区| 鲁片一区二区三区| 日韩综合一区| 欧美成人高潮一二区在线看| 视频一区二区不卡| 伊人色在线视频| a在线欧美一区| 中文字幕av久久爽一区| 一区二区三区四区亚洲| 国产日产精品一区二区三区| 欧美绝品在线观看成人午夜影视| 欧美一级视频免费| 在线播放亚洲激情| 国产精品蜜臀| 国产欧美一区二区三区视频| 国产区精品视频在线观看豆花| 婷婷四月色综合| 国产精品v亚洲精品v日韩精品 | 国产免费xxx| 亚洲少妇自拍| 性生活一级大片| 国产清纯白嫩初高生在线观看91| 精品欧美一区二区久久久久| 日本高清不卡一区| 亚洲第一精品网站| 最近2019年手机中文字幕| 91超碰在线播放| 91免费欧美精品| 久久综合欧美| 黄色大片中文字幕| 精品中文字幕一区二区小辣椒| 亚洲制服丝袜在线播放| 亚洲视频在线一区| 中文字幕+乱码+中文乱码www| 亚洲国产精品嫩草影院久久| 黄网站在线免费看| 国产精品电影网站| 日韩高清电影免费| 一卡二卡三卡视频| 国产精品亚洲专一区二区三区 | 五月天丁香视频| 久久99久久99精品免观看粉嫩| 国模私拍国内精品国内av| 乱一区二区三区在线播放| 欧美女人交a| 亚洲18在线看污www麻豆| 国产午夜精品一区二区| 天天插天天操天天干| 日韩美女主播在线视频一区二区三区| av在线日韩国产精品| 国产成人免费av电影| 日本在线中文字幕一区| aa视频在线播放| 成人免费高清视频在线观看| 91精品国产高清一区二区三蜜臀| 欧美电影一区二区三区| 成人精品一区二区三区校园激情| 欧美一级黑人aaaaaaa做受| 久久1电影院| 成人午夜精品久久久久久久蜜臀| 国产精品综合av一区二区国产馆| 久久久久久久久久97| 欧美日韩国产首页在线观看| av午夜在线| 国产精品一区二区三| 久久精品99久久无色码中文字幕| 欧美精品aaaa| 中文在线免费一区三区高中清不卡| 国产99免费视频| 中文字幕亚洲欧美日韩在线不卡| 国精产品一区二区三区有限公司| 日本不卡一二三区| 日本vs亚洲vs韩国一区三区 | 欧美精品三级| www.四虎在线| 午夜不卡av免费| 欧美少妇另类| 国产精品亚洲第一区| 色综合蜜月久久综合网| 日韩 国产 一区| 一区二区三区成人在线视频| 成人黄色免费视频| 高清欧美性猛交| 少妇一区二区三区| 国产嫩草在线观看| 亚洲欧美综合另类在线卡通| 99视频国产精品免费观看a | 久久久国产成人| 亚洲第一天堂无码专区| 色老头在线一区二区三区| 欧美日韩精品免费在线观看视频| 日韩在线播放一区二区| 香蕉久久久久久久| 欧美一区二区三区在线观看| 久久青青色综合| 欧美成熟毛茸茸复古| 秋霞影院一区二区| 午夜少妇久久久久久久久| 亚洲成人av片| jizzjizz少妇亚洲水多| 亚洲一区 在线播放| 91一区在线观看| 中文字幕在线视频第一页| 欧美猛少妇色xxxxx| 免费成人av| 中文在线字幕观看| 色一区在线观看| 羞羞的视频在线看| 欧美日韩精品不卡| 国产成人啪免费观看软件| www亚洲视频| 久久影视电视剧免费网站| 精品少妇3p| 污视频网址在线观看| 精品久久久久久久久久久久久| 97在线观看免费观看高清| 国产精品二区在线观看| 人人爽香蕉精品| 在线看成人av| 中文字幕久久亚洲| 奇米777国产一区国产二区| 国产精品一区二区小说| 无码av免费一区二区三区试看| av女优在线| 美脚丝袜一区二区三区在线观看| 久久99九九99精品|