精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

无码人妻丰满熟妇区五十路百度| 欧美一级片久久久久久久| 五月天亚洲视频| 国产高清美女一级毛片久久| 美女黄色成人网| 亚洲天堂男人的天堂| 女同激情久久av久久| av软件在线观看| 99热这里都是精品| 国产精品久久久久久久久久久不卡 | 18欧美乱大交hd1984| 91最新国产视频| 国产乡下妇女做爰| 国产精品欧美日韩一区| 欧美精选午夜久久久乱码6080| 97精品国产97久久久久久粉红| 亚洲乱码精品久久久久..| 亚洲精品综合| 在线观看欧美日韩国产| 国产精九九网站漫画| 日韩大片欧美大片| 亚洲男同性恋视频| 国产精品一区二区三区观看| 懂色av蜜臀av粉嫩av喷吹| 在线国产一区二区| 亚洲精品资源在线| 被黑人猛躁10次高潮视频| 中文字幕在线官网| 亚洲品质自拍视频网站| 欧美久久久久久久| 精品毛片在线观看| 免费欧美日韩国产三级电影| 久久久久九九九九| 日本理论中文字幕| 亚洲一区二区av| 欧美午夜片欧美片在线观看| 国产高清免费在线| 狠狠色伊人亚洲综合网站l| 国产盗摄女厕一区二区三区| 国产精品com| 久久精品国产亚洲av无码娇色| 欧美亚洲高清| 亚洲欧美国产精品va在线观看| 男人操女人下面视频| 素人一区二区三区| 亚洲五码中文字幕| 在线成人性视频| 男人久久精品| jlzzjlzz国产精品久久| 亚洲在线免费观看| 一级黄色片免费| 99精品视频免费观看视频| 久热精品视频在线| а天堂中文在线资源| 久久久久久久久久久久久久久久久久久久| 在线电影国产精品| 国产理论在线播放| 免费成人在线电影| 亚洲va在线va天堂| 中文字幕日韩精品无码内射| 黄色在线小视频| 91在线国产观看| 国产一区免费视频| 免费观看a视频| 国产精品99久久不卡二区| 国产精品久久久久影院日本| aaaaaa毛片| 久久午夜影视| 4438全国成人免费| 五月婷婷亚洲综合| 亚洲伊人网站| 性欧美在线看片a免费观看 | 一级特黄大欧美久久久| 一级黄色片播放| 91蜜桃在线视频| 亚洲主播在线播放| 久久手机在线视频| 9999精品成人免费毛片在线看| 亚洲精品久久久蜜桃| 亚洲第一综合网站| 欧美亚洲系列| 日韩欧美在线字幕| 四虎成人在线播放| 首页亚洲中字| 日韩中文字幕在线观看| 免费在线视频一区二区| 香蕉久久久久久久av网站| 国产日韩av在线| 囯产精品久久久久久| 国产亚洲综合av| 国产高清免费在线| 亚洲天堂资源| 777xxx欧美| 激情综合丁香五月| 99久久久久国产精品| 97在线精品国自产拍中文| 中文字幕乱码中文字幕| 国产91精品在线观看| 日韩久久久久久久久久久久久| 国产在线观看a视频| 欧美性xxxxx极品| 在线视频观看一区二区| 中国av一区| 九九九久久久久久| 国产一级片av| 成人激情免费网站| 一区二区精品在线观看| 中老年在线免费视频| 日韩欧美国产一区二区三区| 西西444www无码大胆| 欧美精品aa| 国产女同一区二区| 欧美日韩国产综合视频| 亚洲一区二区三区中文字幕| 亚洲精品视频导航| 欧美调教视频| 欧美精品18videos性欧美| 亚洲无码精品在线播放| 久久精品在线免费观看| 男人插女人视频在线观看| 91成人福利社区| 一本色道久久88综合亚洲精品ⅰ | 色综合天天综合网国产成人综合天| 特级西西444www| 欧美亚洲国产激情| 国产99久久久欧美黑人 | 中文字幕在线播放日韩| 久久先锋影音av| 欧美成人高潮一二区在线看| 日韩黄色av| 美乳少妇欧美精品| 国产男男gay体育生网站| 国产欧美日韩在线看| 免费看的黄色大片| 精品国内亚洲2022精品成人| 欧美—级高清免费播放| 亚洲第一视频在线播放| 一区二区三区四区在线播放 | 国产精品视屏| 久久频这里精品99香蕉| 亚洲风情第一页| 亚洲综合色丁香婷婷六月图片| 日本黄色一级网站| 综合国产精品| 国产一区香蕉久久| 免费a在线看| 7777精品伊人久久久大香线蕉 | 黄网页免费在线观看| 欧美日韩激情一区二区三区| 国产精品酒店视频| 九九视频精品免费| 精品一区二区三区毛片| 亚洲日本va| 国内久久久精品| 天堂中文资源在线| 色综合天天综合网天天看片| 精品成人无码一区二区三区| 免费观看30秒视频久久| 伊人精品久久久久7777| 精品一区二区三区中文字幕视频 | 岛国精品在线观看| 久久久久久www| 色婷婷久久久| 国产精品欧美久久久| 老司机在线永久免费观看| 日韩一区二区三| 日韩福利片在线观看| 久久看人人爽人人| 成 人 黄 色 小说网站 s色| 久久久国产精品| 高清视频一区| av电影一区| 日韩在线播放一区| 亚洲国产日韩在线观看| 欧美日韩视频在线| 女人十八毛片嫩草av| 国产乱码字幕精品高清av | 亚洲欧美日韩成人| 亚洲性在线观看| 一级特黄大欧美久久久| 亚洲欧美变态国产另类| 欧美性生活大片视频| 亚洲码无人客一区二区三区| 美女脱光内衣内裤视频久久网站 | 手机在线电影一区| 97se亚洲综合| 一区二区三区短视频| 日韩亚洲成人av在线| 黄色福利在线观看| 欧美性猛交xxxxxxxx| 欧美激情一区二区视频| 久久蜜桃av一区二区天堂| 91视频福利网| 午夜一级久久| 裸体裸乳免费看| 欧美三级电影在线| 91在线高清视频| 美女日韩欧美| 九九热这里只有在线精品视| 日本韩国精品一区二区| 5858s免费视频成人| 亚洲黄色激情视频| 亚洲精品日产精品乱码不卡| 一道本在线观看| 成人免费视频app| 手机版av在线| 天堂影院一区二区| 国产精品入口芒果| 欧美成人亚洲| 亚洲欧美日韩不卡一区二区三区| 精品淫伦v久久水蜜桃| 亚洲iv一区二区三区| 国产综合色区在线观看| 992tv在线成人免费观看| 八戒八戒神马在线电影| 中文国产亚洲喷潮| 头脑特工队2在线播放| 日韩精品一区国产麻豆| 91激情在线观看| 日本韩国欧美一区| 在线看成人av| 亚洲午夜久久久久久久久电影院 | 图片区日韩欧美亚洲| 永久av免费网站| 国产欧美日韩精品在线| 99热播精品免费| 高清欧美性猛交| 91福利国产在线观看菠萝蜜| 一级做a爰片久久毛片美女图片| 少妇高潮一区二区三区69| 一区二区三区日本久久久| 日本精品va在线观看| 欧美极品少妇videossex| 综合国产在线视频| 中国特级黄色片| 日韩影院在线观看| 欧美xxxxx在线视频| 久久成人一区| 国产乱子夫妻xx黑人xyx真爽| 99在线观看免费视频精品观看| www.日本在线视频| 影音先锋久久精品| 日韩中文字幕在线免费| 在线欧美不卡| 看av免费毛片手机播放 | 久久久久久久免费视频| 国产精品传媒精东影业在线| 一区在线电影| 欧美ab在线视频| 欧美激情亚洲天堂| 极品尤物久久久av免费看| a级黄色小视频| 99国产精品视频免费观看一公开| 丰满爆乳一区二区三区| 亚洲伊人网站| 欧美三级午夜理伦三级富婆| 久久99精品国产| 亚洲精品久久久久久| 成人国产精品免费| 日韩人妻无码一区二区三区| 久久久影院官网| 91导航在线观看| 亚洲男人的天堂网| 国产精品第72页| 日韩欧美视频一区二区三区| 国产精品露脸视频| 欧美一级高清大全免费观看| 欧美 日韩 综合| 亚洲女人被黑人巨大进入| av网站在线免费播放| 九九热最新视频//这里只有精品| caoporn视频在线观看| 国产经典一区二区| 另类一区二区三区| 成人在线免费观看一区| 亚洲+小说+欧美+激情+另类| 色播五月综合| 欧美午夜免费影院| 成年人小视频网站| 国产一区美女在线| 中文字幕5566| 亚洲丝袜精品丝袜在线| 在线天堂中文字幕| 欧美裸体一区二区三区| 天堂在线中文| 久久精品中文字幕| 性欧美freesex顶级少妇| 国产精品中文字幕在线| 激情视频极品美女日韩| 亚洲激情图片| 99热精品在线观看| 日本高清免费在线视频| 久久噜噜亚洲综合| 国产亚洲欧美精品久久久www | 5278欧美一区二区三区| 日本黄色成人| 欧美成人在线免费观看| 午夜精品久久久久99热蜜桃导演| 激情婷婷综合网| 成人激情视频网站| 色欲一区二区三区精品a片| 欧美日韩在线看| 亚洲xxxx天美| 中文字幕亚洲第一| 桃色av一区二区| 99在线视频免费观看| 欧美亚洲激情| 精品视频无码一区二区三区| 国产成人av福利| 国产jizz18女人高潮| 欧美日韩中文在线| 韩国av在线免费观看| 日韩视频欧美视频| 粉嫩91精品久久久久久久99蜜桃 | 每日更新av在线播放| 欧美极品欧美精品欧美视频| 精品国产亚洲一区二区三区| 亚洲第一导航| 日韩在线观看一区二区| 无码h肉动漫在线观看| 亚洲成va人在线观看| 性猛交xxxx乱大交孕妇印度| 神马久久久久久| 99久久综合国产精品二区| 秋霞毛片久久久久久久久| 中文久久精品| www.超碰97| 欧美日韩国产一区二区| 日韩一卡二卡在线| 午夜精品一区二区三区视频免费看| 我要色综合中文字幕| 国内精品国产三级国产99| 韩国欧美一区二区| а天堂中文在线资源| 欧美日韩中文一区| chinese偷拍一区二区三区| 国产成人欧美在线观看| 女人av一区| 日本女优爱爱视频| 国产亚洲一区二区三区四区| 亚洲无码精品一区二区三区| 亚洲人成网站在线播| 欧美不卡高清一区二区三区| 日韩在线三级| 青草国产精品久久久久久| 91香蕉视频污在线观看| 56国语精品自产拍在线观看| 亚洲电影视频在线| 国产精华一区二区三区| 99国产成+人+综合+亚洲欧美| 国产69视频在线观看| 精品久久久久久久久中文字幕| 午夜av免费在线观看| 日本成人免费在线| 精品国精品国产自在久国产应用| av网站在线不卡| 日韩美女啊v在线免费观看| www.狠狠干| 2019中文字幕在线观看| 国产一区三区在线播放| 久久这里只精品| 亚洲激情综合网| 午夜视频在线播放| 国产精品电影观看| 亚洲先锋影音| 免费黄色三级网站| 欧美性淫爽ww久久久久无| 免费大片黄在线| 国产二区一区| 久久经典综合| 国产一区二区视频在线观看免费| 日韩精品一区二区三区视频 | 91热福利电影| 一本色道久久| 四虎永久免费地址| 亚洲大胆人体在线| av在线播放一区| 精品人妻大屁股白浆无码| 久久一二三国产| 99久久精品无免国产免费| 欧美性资源免费| 亚洲91精品| 麻豆av免费观看| 欧美一区二区三区男人的天堂| 欧美xxxhd| 自拍偷拍99| 91蜜桃视频在线| 国产黄色一级大片| 日韩免费观看av| 欧美日韩精品| 精品伦精品一区二区三区视频密桃| 日韩美女视频在线| 激情久久99| 国产精品丝袜久久久久久消防器材| 中文字幕一区二区三区在线不卡| 无码精品黑人一区二区三区| 91精品久久久久| 天堂影院一区二区| 日韩久久久久久久久| 久久久国产精品免费|