Go---设计模式(策略模式)
策略模式定义了算法家族,在调用算法家族的时候不感知算法的变化,客户也不会受到影响。
下面用《大话设计模式》中的一个实例进行改写。
例:超市中经常进行促销活动,促销活动的促销方法就是一个个策略,如“满一百减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.8
type 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返20
type 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打八折实际金额为 80
199满一百返20实际金额为 179
199没有折扣实际金额为 199
*/
总结:策略模式解除了客户对策略的感知,所有策略,甚至cashSuper皆为私有。只需要暴露CashContext就可以生成策略。降低了耦合。
Go---设计模式(策略模式)的更多相关文章
- 15. 星际争霸之php设计模式--策略模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)
[.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- 设计模式-策略模式(Strategy Model)
1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有 ...
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- [Head First设计模式]策略模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- javascript 设计模式-----策略模式
在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...
- JAVA 设计模式 策略模式
用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构
- PHP设计模式-策略模式 转
策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...
随机推荐
- 版本号对比方案及参考代码(Objective-C,Java,JavaScript)
常用版本号 如 2.0.1 与 2.0.2 相比 2.0.2是比2.0.1要新的 那么该如何对这个版本号进行对比 这里有一个比较简单的实现方案 2.0.1 这种格式可以拆分为多个部分 如这里的2是大 ...
- Java实现Web页面前数字字母验证码实现
最近公司做项目开发中用到了验证码实现功能,将实现代码分享出来, 前段页面实现代码: 为了表达清晰,样式部分代码去掉了,大家根据自己的需求,自己添加样式. 页面JS代码:触发变动验证码改变的JS 后台 ...
- ignore-on-commit svn 更改文件后 默认不提交文件到服务器(服务器上已存在的文件)
不用那个忽略文件那个,那个功能是删除服务器的文件,然后本地还存在,不符合我的要求 我的要求是 服务器文件在,我不动,然后我改完了,和别人的不冲突,我也不覆盖别人的文件 主要就是默认不提交,这个很重要 ...
- OpenCV2:第六章 图像几何变换
一.简介 图像的几何变换有距离变换 坐标映射 平移 镜像 旋转 缩放 仿射变换等 二.重映射 把一张图像重新排列像素,比如倒置 CV_EXPORTS_W void remap( InputArr ...
- 报错:org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n ...
- 纯html+css中实现静态选座位效果技巧(input+label使用小技巧)
很多时候,我们想通过html+css的方式实现排列在后方的代码在选中状态下,能控制排列在前的代码的样式.那么要怎么实现呢?在这里我就要用1个小技巧来完成. 众所周知的,我们css中的选择器通常只能向下 ...
- 串的基本操作(KMP算法实现)
#include <iostream> #include <math.h> using namespace std; void StrAssign(char *T) { cha ...
- [JOYOI] 1061 Mobile Service
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个 ...
- Chrome浏览器 v68.0.3440.106 正式版怎么样?
谷歌浏览器Google Chrome稳定版迎来v68正式版第三个维护版本发布,详细版本号为v68.0.3440.106,上一个正式版v68.0.3440.84发布于8月1日,时隔8天Google又发布 ...
- pwnable.kr cmd1之write up
看一下源代码: #include <stdio.h> #include <string.h> int filter(char* cmd){ ; r += strstr(cmd, ...