Go語言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解
概述
定義一系列算法,將每個(gè)算法封裝起來。并讓它們能夠相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化。
針對同一類型問題的多種處理方式
一、不使用策略模式
package main import "fmt" type User struct { Name string } func (this User) travel(t string) { switch t { case "飛機(jī)": fmt.Printf("%s,飛機(jī)出行\(zhòng)n", this.Name) case "火車": fmt.Printf("%s,火車出行\(zhòng)n", this.Name) case "走路": fmt.Printf("%s,走路出行\(zhòng)n", this.Name) default: fmt.Println("你未選擇了出行方式嗎") } } func main() { User{"張三"}.travel("飛機(jī)") User{"張三"}.travel("火車") User{"張三"}.travel("走路") User{"張三"}.travel("") }
問題:
代碼很多且復(fù)雜,if…else…多,不利于維護(hù)和擴(kuò)展違反了"開閉原則",增加新的出行方式必須修改源碼復(fù)用性差,無法單獨(dú)重用其中的某個(gè)或某些算法
二、策略模式
生活策略模式例子:
張三從廣東去北京【1.坐飛機(jī),2.坐火車,3.走路】鵝廠推出了3種會(huì)員,分別為會(huì)員,超級會(huì)員、及金牌會(huì)員【皮膚不同,折扣不同】諸葛亮的錦囊妙計(jì)
策略模式涉及到三個(gè)角色:
編號 | 角色 | 描述 |
---|---|---|
1 | 環(huán)境(Context)角色 | 持有一個(gè)Strategy的引用 |
2 | 抽象策略(Strategy)角色 | 這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)。此角色給出所有的具體策略類所需的接口 |
3 | 具體策略(ConcreteStrategy)角色 | 包裝了相關(guān)的算法或行為。 |
UML
總結(jié)
優(yōu)點(diǎn):
策略模式提供了對“開閉原則”的完美支持,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為,也可以靈活地-增加新的算法或行為。提供管理相關(guān)的算法族可以替換繼承關(guān)系的辦法。避免使用多重條件轉(zhuǎn)移語句。
缺點(diǎn):
客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類策略模式將造成產(chǎn)生很多策略類,可以通過使用享元模式在一定程度上減少對象的數(shù)量
示例
package main import "fmt" /*出行方式*/ type Itravel interface { Travel() } /*飛機(jī)*/ type Aircraft struct{} /*火車*/ type Train struct{} /*走路*/ type Walk struct{} /*具體策略類 1:飛機(jī)出行*/ func (this Aircraft) Travel() { fmt.Println("飛機(jī)出行") } /*具體策略類 2:火車出行*/ func (this Train) Travel() { fmt.Println("火車出行") } /*具體策略類 3:走路出行*/ func (this Walk) Travel() { fmt.Println("走路出行") } /*環(huán)境類*/ type User struct { Name string Itravel Itravel } func (this User) travel() { fmt.Printf("%s", this.Name) this.Itravel.Travel() } func main() { user := User{"張三", Aircraft{}} user.travel() user = User{"李四", new(Train)} user.travel() user = User{"王五", &Walk{}} user.travel() }
以上就是Go語言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語言策略模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
GO使用阿里云,解決go get下載項(xiàng)目慢或無法下載的情況
這篇文章主要介紹了GO使用阿里云,解決go get下載項(xiàng)目慢或無法下載的情況,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01golang打包成帶圖標(biāo)的exe可執(zhí)行文件
這篇文章主要給大家介紹了關(guān)于golang打包成帶圖標(biāo)的exe可執(zhí)行文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06Golang實(shí)現(xiàn)KV存儲(chǔ)引擎實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)KV存儲(chǔ)引擎實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01