Go 實現常用設計模式(二)策略模式

pibigstar發表於2019-09-07

意圖:
定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。

關鍵程式碼:
實現同一個介面

應用例項:

  1. 主題的更換,每個主題都是一種策略
  2. 旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略
  3. JAVA AWT 中的 LayoutManager

Go實現策略模式

package strategy

// 策略模式

// 實現此介面,則為一個策略
type IStrategy interface {
    do(int, int) int
}

// 加
type add struct{}

func (*add) do(a, b int) int {
    return a + b
}

// 減
type reduce struct{}

func (*reduce) do(a, b int) int {
    return a - b
}

// 具體策略的執行者
type Operator struct {
    strategy IStrategy
}

// 設定策略
func (operator *Operator) setStrategy(strategy IStrategy) {
    operator.strategy = strategy
}

// 呼叫策略中的方法
func (operator *Operator) calculate(a, b int) int {
    return operator.strategy.do(a, b)
}

測試用例

package strategy

import (
   "fmt"
 "testing")

func TestStrategy(t *testing.T) {
   operator := Operator{}

   operator.setStrategy(&add{})
   result := operator.calculate(1, 2)
   fmt.Println("add:", result)

   operator.setStrategy(&reduce{})
   result = operator.calculate(2, 1)
   fmt.Println("reduce:", result)
}

具體程式碼

更詳細的程式碼可參考:https://github.com/pibigstar/go-demo 裡面包含了 Go 常用的設計模式、Go 面試易錯點、簡單的小專案(區塊鏈,爬蟲等)、還有各種第三方的對接(redis、sms、nsq、elsticsearch、alipay、oss...),如果對你有所幫助,請給個 Star,你的支援,是我最大的動力!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章