博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go---设计模式(策略模式)
阅读量:5770 次
发布时间:2019-06-18

本文共 2422 字,大约阅读时间需要 8 分钟。

策略模式定义了算法家族,在调用算法家族的时候不感知算法的变化,客户也不会受到影响。

下面用《大话设计模式》中的一个实例进行改写。

 

例:超市中经常进行促销活动,促销活动的促销方法就是一个个策略,如“满一百减20”,“打八折”等。现在实现策略模式,用CashContext生产策略,并完成策略的调用。

 

1.首先定义所有策略的接口。

 

package cash type cashSuper interface {    AcceptMoney(money float64) float64}

 

2.定义三个子类,实现此接口

 

package cash //普通情况,没有折扣type cashNormal struct {} func newCashNormal() cashNormal {    instance := new(cashNormal)    return *instance} func (c cashNormal) AcceptMoney(money float64) float64 {    return money}

 

 

package cash //打折,传入打折的折扣,如0.8type cashRebate struct {    Rebate float64 //折扣} func newCashRebate(rebate float64) cashRebate {    instance := new(cashRebate)    instance.Rebate = rebate    return *instance} func (c cashRebate) AcceptMoney(money float64) float64 {    return money * c.Rebate}

 

 

 

package cash //直接返利,如满100返20type cashReturn struct {    MoneyCondition float64    MoneyReturn    float64} func newCashReturn(moneyCondition float64, moneyReturn float64) cashReturn {    instance := new(cashReturn)    instance.MoneyCondition = moneyCondition    instance.MoneyReturn = moneyReturn    return *instance} func (c cashReturn) AcceptMoney(money float64) float64 {    if money >= c.MoneyCondition {        moneyMinus := int(money / c.MoneyCondition)        return money - float64(moneyMinus)*c.MoneyReturn    }    return money}

3.最重要的时刻来临了,定义CashContext结构,用来做策略筛选

 

package cash type CashContext struct {    Strategy cashSuper} func NewCashContext(cashType string) CashContext {    c := new(CashContext)    //这里事实上是简易工厂模式的变形,用来生产策略    switch cashType {    case "打八折":        c.Strategy = newCashRebate(0.8)    case "满一百返20":        c.Strategy = newCashReturn(100.0, 20.0)    default:        c.Strategy = newCashNormal()    }    return *c} //在策略生产成功后,我们就可以直接调用策略的函数。func (c CashContext) GetMoney(money float64) float64 {    return c.Strategy.AcceptMoney(money)}

4.调用测试

 

package main import (    "cash"    "fmt") func main() {    money := 100.0    cc := cash.NewCashContext("打八折")    money = cc.GetMoney(money)    fmt.Println("100打八折实际金额为", money)     money = 199    cc = cash.NewCashContext("满一百返20")    money = cc.GetMoney(money)    fmt.Println("199满一百返20实际金额为", money)     money = 199    cc = cash.NewCashContext("没有折扣")    money = cc.GetMoney(money)    fmt.Println("199没有折扣实际金额为", money) } /***************************************输出:100打八折实际金额为 80199满一百返20实际金额为 179199没有折扣实际金额为 199*/

总结:策略模式解除了客户对策略的感知,所有策略,甚至cashSuper皆为私有。只需要暴露CashContext就可以生成策略。降低了耦合。

转载地址:http://ejiux.baihongyu.com/

你可能感兴趣的文章
[Android] charles高级使用总结
查看>>
利用 ProtoThreads实现Arduino多线程处理(2)
查看>>
NPAIRS框架的理解
查看>>
UNITY 网格合并
查看>>
快速搭建YUM源和yum使用
查看>>
在O(1)时间删除链表结点
查看>>
页面中checkbox返回的是一个数组,如何对数组进行操作
查看>>
Uncaught SyntaxError: Invalid or unexpected token
查看>>
SqlMembershipProvider.CreateUser 方法(测试已通过)
查看>>
ActiveMQ之composite destinations
查看>>
sql server 2008学习5 sql基础
查看>>
第12届北师大校赛热身赛第二场 A.不和谐的长难句1
查看>>
网络虚拟化技术
查看>>
常用名词缩写
查看>>
git hub的GUI软件配置与使用
查看>>
发布基于GAE的个人Wiki系统 - NancyWiki
查看>>
MVC中,查询以异步呈现,分页不用异步的解决方案
查看>>
第 15 章 NFS
查看>>
Hibernate基于JDBC的批量删除
查看>>
Netty了解与小试
查看>>