Go語言基礎(chǔ)設(shè)計模式之策略模式示例詳解

概述
定義一系列算法,將每個算法封裝起來。并讓它們能夠相互替換。策略模式讓算法獨立于使用它的客戶而變化。
針對同一類型問題的多種處理方式
一、不使用策略模式
package main
import "fmt"
type User struct {
Name string
}
func (this User) travel(t string) {
switch t {
case "飛機":
fmt.Printf("%s,飛機出行\(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("飛機")
User{"張三"}.travel("火車")
User{"張三"}.travel("走路")
User{"張三"}.travel("")
}
問題:
代碼很多且復(fù)雜,if…else…多,不利于維護和擴展違反了"開閉原則",增加新的出行方式必須修改源碼復(fù)用性差,無法單獨重用其中的某個或某些算法
二、策略模式
生活策略模式例子:
張三從廣東去北京【1.坐飛機,2.坐火車,3.走路】鵝廠推出了3種會員,分別為會員,超級會員、及金牌會員【皮膚不同,折扣不同】諸葛亮的錦囊妙計
策略模式涉及到三個角色:
| 編號 | 角色 | 描述 |
|---|---|---|
| 1 | 環(huán)境(Context)角色 | 持有一個Strategy的引用 |
| 2 | 抽象策略(Strategy)角色 | 這是一個抽象角色,通常由一個接口或抽象類實現(xiàn)。此角色給出所有的具體策略類所需的接口 |
| 3 | 具體策略(ConcreteStrategy)角色 | 包裝了相關(guān)的算法或行為。 |
UML

總結(jié)
優(yōu)點:
策略模式提供了對“開閉原則”的完美支持,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為,也可以靈活地-增加新的算法或行為。提供管理相關(guān)的算法族可以替換繼承關(guān)系的辦法。避免使用多重條件轉(zhuǎn)移語句。
缺點:
客戶端必須知道所有的策略類,并自行決定使用哪一個策略類策略模式將造成產(chǎn)生很多策略類,可以通過使用享元模式在一定程度上減少對象的數(shù)量
示例
package main
import "fmt"
/*出行方式*/
type Itravel interface {
Travel()
}
/*飛機*/
type Aircraft struct{}
/*火車*/
type Train struct{}
/*走路*/
type Walk struct{}
/*具體策略類 1:飛機出行*/
func (this Aircraft) Travel() {
fmt.Println("飛機出行")
}
/*具體策略類 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è)計模式之策略模式示例詳解的詳細內(nèi)容,更多關(guān)于Go語言策略模式的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信