自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊 Golang 策略設(shè)計(jì)模式

開發(fā) 前端
在策略設(shè)計(jì)模式中,我們可以在運(yùn)行時(shí)動態(tài)切換或選擇策略,這意味著可以在不修改代碼的情況下改變對象使用的算法。策略的選擇可以基于各種因素,如用戶輸入、配置設(shè)置或特定條件。

假設(shè)有一個(gè)名為 PaymentStrategy 的接口,包含一個(gè)名為 Pay() 的方法,有兩種名為 CreditCardStrategy 和 DebitCardStrategy 的類型實(shí)現(xiàn)了該接口。我們希望根據(jù)不同情況,PaymentStrategy.Pay() 可以執(zhí)行 CreditCardStrategy 類型或 DebitCardStrategy 類型的實(shí)現(xiàn)。如何才能做到這一點(diǎn)呢?

可以通過策略設(shè)計(jì)模式來實(shí)現(xiàn)這一目標(biāo),但首先我們需要知道什么是策略設(shè)計(jì)模式?

策略模式處理的情況是,有多種算法或行為(算法可能有不同的實(shí)現(xiàn)方式,但目的類似),這些算法或行為可以互換或動態(tài)使用。例如,可能有不同的排序算法,如冒泡排序、合并排序和快速排序,目的都是對一個(gè)集合進(jìn)行排序。另一個(gè)例子是 Pay() 方法,對于 CreditCardStrategy 類型和 DebitCardStrategy 類型,Pay() 方法的實(shí)現(xiàn)可能不同,但兩種方法的目的是一樣的。

上面提到不同算法,每種算法都封裝在自己的類或類型中,這個(gè)類或類型代表算法的獨(dú)立策略,這樣的類被稱為策略類。策略類提供一組方法,用于定義策略的執(zhí)行方式。例如,CreditCardStrategy 和 DebitCardStrategy 這兩種類型都實(shí)現(xiàn)了 Pay() 方法。因此,我們可以說每個(gè) Pay() 方法都封裝了一個(gè)類型,每個(gè)類型代表一個(gè)單獨(dú)的策略。例如,CreditCardStrategy 類型表示使用信用卡付款,而 DebitCardStrategy 類型表示將使用借記卡付款。也就是說,這兩種類型分別代表兩種策略,這就是它們被稱為策略類或策略類型的原因。

在策略設(shè)計(jì)模式中,我們可以在運(yùn)行時(shí)動態(tài)切換或選擇策略,這意味著可以在不修改代碼的情況下改變對象使用的算法。策略的選擇可以基于各種因素,如用戶輸入、配置設(shè)置或特定條件。例如,如果用戶需要,可以使用 CreditCardStrategy,也可以使用 DebitCardStrategy。為此,我們不需要在編碼中做任何修改,而是可以動態(tài)處理。

策略模式促進(jìn)了使用算法的代碼(客戶端代碼)與算法的實(shí)際實(shí)現(xiàn)(策略類)之間的松耦合??蛻舳舜a通過通用接口或抽象與策略進(jìn)行交互,而無需了解每個(gè)策略實(shí)現(xiàn)的具體細(xì)節(jié)。這使得代碼庫具有更高的靈活性、可維護(hù)性和可擴(kuò)展性。例如,這里的通用接口是 PaymentStrategy,客戶端代碼只需要與 PaymentStrategy 方法通信,而不需要與策略通信。也就是說,不需要考慮 CreditCardStrategy 類型或 DebitCardStrategy,客戶代碼與它們沒有任何關(guān)系。代碼只與通用接口相關(guān)聯(lián),根據(jù)實(shí)際情況,通用接口將決定實(shí)施哪一個(gè)。

因此,從這里我們可以列出策略設(shè)計(jì)模式的要點(diǎn):

  • 可互換算法
  • 將每種算法封裝為單獨(dú)的類
  • 策略在運(yùn)行時(shí)可以互換
  • 避免算法實(shí)現(xiàn)與客戶端代碼緊耦合

舉個(gè)例子:

package main

import "fmt"

type PaymentStrategy interface {
 Pay()
}

// Credit Card Strategy Type
type CreditCardStrategy struct{}

func (c *CreditCardStrategy) Pay() {
 fmt.Println("Paying using Credit Card")
}

// Debit Card Strategy Type
type DebitCardStrategy struct{}

func (d *DebitCardStrategy) Pay() {
 fmt.Println("Paying using Debit Card")
}

// Visa Card Strategy Type
type VisaCardStrategy struct{}

func (v *VisaCardStrategy) Pay() {
 fmt.Println("Paying using Visa Card")
}

// This type sets the strategy dynamically
type PaymentMethod struct {
 paymentStrategy PaymentStrategy
}

func (p *PaymentMethod) setPaymentMethodStrategy(strategy PaymentStrategy) {
 p.paymentStrategy = strategy
}

func (p *PaymentMethod) checkOut() {
 p.paymentStrategy.Pay()
}

func main() {
 paymentMethod := &PaymentMethod{}

 // Credit Card
 creditCardStrategy := &CreditCardStrategy{}
 paymentMethod.setPaymentMethodStrategy(creditCardStrategy)
 paymentMethod.checkOut()

 // Debit Card
 debitCardStrategy := &DebitCardStrategy{}
 paymentMethod.setPaymentMethodStrategy(debitCardStrategy)
 paymentMethod.checkOut()

 // Visa Card
 visaCardStrategy := &VisaCardStrategy{}
 paymentMethod.setPaymentMethodStrategy(visaCardStrategy)
 paymentMethod.checkOut()
}

示例中有三種不同的支付策略,分別是 CreditCardStrategy、VisaCardStrategy 和 DebitCardStrategy。每種策略的支付流程不同,但目的相同,都是支付。

PaymentMethod 類型處理策略的選擇。代碼只需與 PaymentMethod 聯(lián)系,PaymentMethod 根據(jù)情況決定選擇哪種策略。為此,我們不需要對 PaymentMethod 類型做任何修改?;蛘哒f,我們不需要在 PaymentMethod 類型中定義任何有關(guān)策略的內(nèi)容。這就是策略設(shè)計(jì)模式的魅力所在。我們不需要提及策略,但可以使用它們。這就是所謂的松耦合。

讓我們再舉一個(gè)例子:

package main

import "fmt"

type Animal interface {
 bark()
}

type Dog struct{}

func (d *Dog) bark() {
 fmt.Println("Bark by Dog")
}

type Cat struct{}

func (c *Cat) bark() {
 fmt.Println("Bark by a Cat")
}

type Bark struct {
 animal Animal
}

func (b *Bark) setBarkType(barkType Animal) {
 b.animal = barkType
}

func (b *Bark) checkBark() {
 b.animal.bark()
}

func main() {
 animalBark := &Bark{}

 dogBark := &Dog{}
 animalBark.setBarkType(dogBark)
 animalBark.checkBark()

 catBark := &Cat{}
 animalBark.setBarkType(catBark)
 animalBark.checkBark()
}

最后舉一個(gè)真實(shí)的例子。

我們以文本編輯器為例,文本編輯器需要支持不同的文本格式選項(xiàng),如粗體、斜體和下劃線。對于不同的文本格式選項(xiàng),并不需要在文本編輯器類中實(shí)現(xiàn)這些格式選項(xiàng),而是可以根據(jù)選擇應(yīng)用策略模式。

每個(gè)文本格式選項(xiàng)(粗體、斜體、下劃線)都封裝在單獨(dú)的策略類中,每個(gè)策略類都實(shí)現(xiàn)了通用接口或抽象類,定義了應(yīng)用格式化的行為。文本編輯器類有對當(dāng)前格式化策略的引用,并用它對選定文本應(yīng)用格式化。在運(yùn)行時(shí),用戶可以在不同的格式化策略之間切換,文本編輯器會應(yīng)用所選的格式化,而無需修改其核心代碼。

通過在這種情況下使用策略模式,文本編輯器實(shí)現(xiàn)了靈活性,允許用戶在運(yùn)行時(shí)選擇格式化策略,而無需將文本編輯器代碼與特定格式化實(shí)現(xiàn)緊密耦合。這種關(guān)注點(diǎn)分離和策略的可互換性正是策略設(shè)計(jì)模式的精髓所在。

策略設(shè)計(jì)模式的優(yōu)勢

  • 改進(jìn)代碼組織:通過使用策略模式,可以將算法行為分離到不同的策略類或類型中,從而實(shí)現(xiàn)代碼的簡潔和可重用性。每個(gè)策略類專注于特定算法,使代碼更易于理解和維護(hù)。
  • 增強(qiáng)靈活性和可維護(hù)性:以 PaymentStrategy 為例。假設(shè)我們引入了新的 PaymentStrategy,不需要對 PaymentMethod 類做任何修改,只需聲明一個(gè)實(shí)現(xiàn)了 Pay() 方法的類型即可。這將增加靈活性。
  • 可重用性:我們可以在需要類似行為的不同對象或系統(tǒng)中重復(fù)使用策略。一旦定義了策略,就可以輕松將其插入多個(gè)上下文中,而無需重復(fù)代碼。
  • 可讀性:由于每個(gè)策略都有獨(dú)立的策略類及其實(shí)現(xiàn)方式,代碼變得可讀、可辨。
  • 可測試性:代碼變得可讀,測試代碼也就更容易。如果出現(xiàn)任何問題,也很容易修復(fù)錯(cuò)誤,可以很容易找到錯(cuò)誤,并知道如何處理。

策略設(shè)計(jì)模式的注意事項(xiàng)

就策略設(shè)計(jì)模式而言,必須牢記以下幾點(diǎn):

  • 類數(shù)量增加:如果策略數(shù)量增加,類的數(shù)量也會增加。雖然這可以改善代碼組織,但也會增加整體設(shè)計(jì)的復(fù)雜性,代碼庫會變得更大。重要的是要達(dá)到平衡,避免創(chuàng)建過多的類。
  • 策略的架構(gòu):以適當(dāng)層次或順序定義策略非常重要。我們需要查找重復(fù)的類,不同的類可能有相同的實(shí)現(xiàn),為此可以使用單個(gè)類。
  • 初始化以及策略選擇:需要決定何時(shí)以及如何初始化策略,以及如何在運(yùn)行時(shí)選擇合適的策略,需要非常謹(jǐn)慎的處理這一點(diǎn)。這可以通過依賴注入、配置文件或基于特定條件或用戶輸入的動態(tài)選擇來實(shí)現(xiàn)。
責(zé)任編輯:武曉燕 來源: DeepNoMind
相關(guān)推薦

2013-11-26 16:09:34

Android設(shè)計(jì)模式

2022-03-25 11:01:28

Golang裝飾模式Go 語言

2021-06-09 08:53:34

設(shè)計(jì)模式策略模式工廠模式

2015-09-08 13:39:10

JavaScript設(shè)計(jì)模式

2022-06-07 08:55:04

Golang單例模式語言

2023-03-21 07:57:37

Go語言設(shè)計(jì)模式

2017-07-07 10:55:14

數(shù)據(jù)庫MongoDB設(shè)計(jì)模式

2012-08-30 09:07:33

設(shè)計(jì)模式

2024-01-29 12:22:07

設(shè)計(jì)模式策略模式

2014-12-29 10:39:16

JS

2024-01-07 12:47:35

Golang流水線設(shè)計(jì)模式

2023-03-10 15:45:03

Golang公平鎖

2024-12-13 08:28:45

設(shè)計(jì)模式依賴

2023-05-22 13:27:17

2024-05-27 00:01:00

2023-11-06 09:21:39

表達(dá)式類型Cause

2024-09-03 10:40:38

2022-11-07 08:01:18

Git分支管理

2023-01-26 00:59:39

B-Treegolang度量衡

2022-10-24 00:03:26

GolangNew函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號