Strategy 策略模式:

定義一整組演算法, 講每一個演算法封裝起來, 可互換使用, 更可在不影響外界的情況下個別抽換所以引用的演算法

可以將互換的行為封裝起來, 並使用轉接方式決定要使用何者 用戶端實體化的事 CashContext 的物件, 調用的是 CashContext 的方法 GetResult 使具體的收費演算法測底與用戶端分離

UML

Example

https://github.com/kimi0230/DesignPatternGolang/tree/master/Strategy

/*
Strategy 策略模式: 講可以互換的行為封裝起來, 並使用專接方式決定要使用何者
用戶端實體化的事 CashContext 的物件, 調用的是 CashContext 的方法 GetResult
使具體的收費演算法測底與用戶端分離
*/

package strategy

import "errors"

type CashSuper interface {
    acceptCash(memory float32) float32
}

// CashNomal : 正常收費
type CashNomal struct {
}

func (this *CashNomal) acceptCash(money float32) float32 {
    return money
}

// CashRebate : 打折收費
// meneyRebate 折扣率
type CashRebate struct {
    meneyRebate float32
}

func (this *CashRebate) acceptCash(money float32) float32 {
    return this.meneyRebate * money
}

// CashReturn : 紅利收費
// 比如滿300送100, meneyCondition=300, meneyReturn=100
type CashReturn struct {
    meneyCondition float32
    meneyReturn    float32
}

func (this *CashReturn) acceptCash(money float32) float32 {
    if money >= this.meneyCondition {
        return money - float32(int(money/this.meneyCondition))*this.meneyReturn
    } else {
        return money
    }
}

type CashContext struct {
    CashSuper
}

func (cc *CashContext) CashContext(str string) error {
    switch str {
    case "正常收費":
        cc.CashSuper = &CashNomal{}
    case "滿300送100":
        cc.CashSuper = &CashReturn{300, 100}
    case "打8折":
        cc.CashSuper = &CashRebate{0.8}
    default:
        err := errors.New("no match")
        return err
    }
    return nil
}

func (cc *CashContext) GetResult(money float32) float32 {
    return cc.acceptCash(money)
}
© Kimi Tsai all right reserved.            Updated : 2022-09-30 06:29:46

results matching ""

    No results matching ""