golang 設計模式 續

2021-08-15 07:34:26 字數 3481 閱讀 4167

模版模式(template)

介紹

模版模式:模版模式在抽象類或父類中抽象出演算法步驟作為模版,模版的具體推遲到子類實現。

·模版模式在父類或抽象類中定義了乙個演算法骨架,並在父類或抽象類中實現共同的部分,各個不同的步驟由不同的子類分別實現;

·模版模式在父類的演算法步驟中定義鉤子(hook),在子類中判斷並定義一些不是非通用步驟;

·模版模式與策略模式的不同之處在於,策略模式是針對多個不同的演算法,而模版演算法是針對乙個演算法的不同步驟,在模版模式中,只有乙個演算法。

場景

·多個演算法有多個共同之處,但某些步驟略微不同;

·各子類步驟順序一致,但步驟的具體實現有所不同;

實現

1.有發郵件和發簡訊兩種通訊方式;

2.它們都需要目標資訊,格式化正文、填寫傳送方資訊,但實現不同;

3.在資訊類中抽象三個步驟,具體的處理方式由兩種通訊方式各自實現;

4.傳送資訊時呼叫資訊類中的傳送方式,傳送方法會按照順序自動呼叫對應的步驟;

迭代器模式(iterator)

介紹

迭代器模式:迭代器模式允許呼叫者在不知道類內部實現的情況下遍歷類元素。

·迭代器介面常用方法有length(),next(),previous(),remove()等;

·各類在內部實現迭代器介面,用對應方法操作元素;

·呼叫者不考慮內部實現,呼叫迭代器介面即可;

場景

·類使用不同的資料結構儲存資料;

·需要對不同的資料型別進行遍歷等操作;

實現

1.使用slice儲存一列戰馬,使用map儲存一列士兵;

2.戰馬和士兵結構都實現了迭代器介面;

3.獲取戰馬數和士兵數,遍歷戰馬和士兵,呼叫迭代器介面即可;

組合模式(composite)

介紹

組合器模式:使用一種元件抽象來同時表達集合與元素,使用統一的介面來管理集合和元素。

·組合模式通常為樹結構,父節點和子節點具有同樣的抽象和介面;

·在操作集合時,會同時操作集合所屬的具體元素;

·通常給組合模式新增乙個迭代器來完成組合結構的迭代;

場景

·管理的多個物件構成樹型層級結構;

·操作高層級的物件時,需要同時操作其所屬的下級物件,如介面視窗等;

實現

1.將軍、隊長、士兵構成樹型層級結構,且他們都是戰士,擁有戰鬥方法;

2.每位展示都儲存著自己的下級名單,沒有下級時忽略;

3.每個人在戰鬥時,都會率領著下級戰鬥;

狀態模式(state)

介紹

狀態模式:狀態模式抽象出乙個事物的狀態作為類,解耦事物和不同的狀態下的行為;

·狀態模式通過替換狀態物件作為狀態轉換的方式;

·狀態物件實現根據狀態動作的介面,可以根據不同的動作做出對應的反應;

·狀態模式和策略模式的實現相似,但狀態模式是對類內部狀態做出改變,而策略模式是針對演算法封裝;

場景

·事物有多種狀態,且可以相互轉換;

·事物多種狀態下對同一動作做出的行為不同;

實現

1.植物有幼苗、開花和成熟三種狀態,且它們會通過澆水和收穫的動作進行相互轉換;

2.幼苗和開花時不能收穫,只能澆水,成熟狀態只能收穫,不需要澆水;

3.定義三種狀態,和它們對不同動作時的行為,植物通過三種物件的替換來進行狀態轉換;

**模式(proxy)

介紹

**模式:給物件提供乙個**,由**物件控制對原物件的呼叫;

·**模式為乙個物件建立另外乙個類作為其訪問的介面,所有對真實物件的請求都通過**當物件完成;

·**模式可以被用作:遠端**、虛擬**,安全**,指標引用,延遲載入;

場景

·物件無法被直接訪問時;

·物件過大、初始化較慢;

·物件不必要立刻初始化,可使用預設值代替;

實現

1.小名給暗戀物件寫了一封信,在等回信;

2.郵遞員是個非常忙的人,來不及去收取回信;

3.小名好聲好氣向快遞員要回信時,郵遞員都推託說自己要去取;

4.小名發怒了,郵遞員終於抽時間去取了信給小名;

5.此信中郵遞員就是**模式中的**,她實現了懶載入;

6.回信內容見原始碼

橋接模式(bridge)

介紹

橋接模式:將事務的多個緯度都抽象出來以解耦抽象與實際之間的繫結關係,使抽象和實際向著不同緯度改變;

·橋接模式通過物件的組合來解決事物的多維度變化問題,以替代多繼承的不靈活;

·橋接模式可以輕易在多維度上擴充套件,為不改變原有模式;

·橋接模式與策略模式的不同之處:策略模式是針對乙個不變的主題替換抽象演算法,而橋接模式是策略磨死的高緯度狀態,它的主題也可能會被替換;

場景

·某事物在多個緯度上都有變化;

·無法使用多繼承或使用多繼承會很不靈活;

實現

1.作畫時可以使用鉛筆和原子筆等不同的筆,也可以在宣紙或普通a4紙;

2.抽象出筆和紙兩種物件;

3.自由組合筆和紙進行作畫;

建造者模式(builder)

介紹

建造者模式:建造者模式分離建立複雜物件的過程和細節,使得同樣的建立過程能建立不同的物件。

·建造者模式將建立物件部件的一般過程抽象出介面,而由不同的建造者類實現具體的介面,實現過程的步驟;

·通過建造者,呼叫者不用考慮物件建立過程的細節,而建造者也可以被靈活替換;

·與模版模式的區別:建造者模式使用類的組合進行物件的建立,而模版模式使用類的繼承實現物件的具體構造;

·與工廠模式的區別,工廠模式會返回乙個具體類,而建造者模式會建造出乙個由多個類組裝而成的完整類;

場景

·物件的建立包含其他物件為類元素,建立過程複雜;

·多個複雜物件的建立過程具有高度相似性;

實現

1.中國式建築有金色屋頂和紅色大門,而意式建築有圓頂和白色大門;

2.中國建築師和意式建築師分別擅長建造不同型別的建築;

3.我們在蓋不同型別的房子時先建立乙個建築師,再用建築師去建立對應風格的房子;

參考:

Golang 設計模式

策略模式 strategy 簡介 策略模式 將演算法或操作抽象成實現共同介面 可以被替換的類,實現邏輯和具體演算法的解耦。將各種行為抽象成演算法,封裝演算法為物件 演算法實現共同介面,呼叫者呼叫時不考慮演算法具體實現,呼叫介面方法即可 呼叫者可隨時替換此演算法物件 應用場景 多個方法選擇一使用,且它...

Golang設計模式 工廠模式

定義乙個用於建立物件的介面,讓子類界定例項化哪個類。工廠方法使乙個類的例項化延遲到子類。簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶的選擇動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。如果是翻譯,讓客戶端不管用哪個類的例項,只需把翻譯型別 int 1,2,3 給工廠...

設計模式golang 工廠模式

建立物件的介面,讓其子類自己決定例項化哪個類,工廠模式使其建立過程延遲到子類進行。1.產品抽象介面 2.工廠建立產品方法 3.產品例項 選銀行借錢的例子,資質方法根據你的收入等其他情況給你選擇銀行。抽象產品介面 type bank inte ce 具體銀行產品例項 type bjbank struc...