设计模式:可复用面向对象软件的基础 书中对 Strategy 模式的定义如下:

定义了一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于它的用户而变化。

案例:设计一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。商场有许多促销的策略,打折,满300减100等。。。

策略模式可以减少各种算法类与使用算法类之间的耦合;

简化单元测试,因为每个算法都有自己的类,可以通过自己的接口进行单元测试。

注意: 下面代码中用一个 CashContext 的 智能指针类来保存 基类的指针。。

#include <string>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cassert> /* abstract base class
* define interface
*/
class CashSuper
{
public:
virtual ~CashSuper() {}
virtual double acceptCash(double money) = 0;
}; class CashNormal : public CashSuper
{
public:
double acceptCash(double money){
return money;
}
}; class CashRebate : public CashSuper{
public:
CashRebate(std::string moneyRate = "0.0"){
std::stringstream s(moneyRate);
s >> this->moneyRate_;
} double acceptCash(double money){
return money * moneyRate_;
}
private:
double moneyRate_;
}; class CashReturn : public CashSuper{
public:
CashReturn(std::string moneyCondition, std::string moneyReturn){
std::stringstream s(moneyCondition);
s >> this->moneyCondition_;
std::stringstream s2(moneyReturn);
s2 >> this->moneyReturn_;
} double acceptCash(double money){
if(money >= moneyCondition_){
money -= std::floor(money / moneyCondition_) * moneyReturn_;
}
return money;
}
private:
double moneyCondition_, moneyReturn_;
}; /* handler class
* smart pointer
*/
class CashContext{
public:
CashContext(std::string type)
: pCashSuper_(NULL), use(new std::size_t(1))
{
if(type == "正常收费"){
pCashSuper_ = new CashNormal;
}
else if(type == "满300减100"){
pCashSuper_ = new CashReturn("300", "100");
}
else if(type == "打8折"){
pCashSuper_ = new CashRebate("0.8");
}
// else
} // copy control
CashContext(const CashContext &rhs)
: pCashSuper_(rhs.pCashSuper_), use(rhs.use)
{
++ *use;
}
// deal with self-assignment
CashContext& operator=(const CashContext &rhs){
++ *(rhs.use);
if(-- *use == 0){
delete pCashSuper_;
delete use;
}
pCashSuper_ = rhs.pCashSuper_;
use = rhs.use;
return *this;
} ~CashContext(){
if(-- *use == 0){
delete pCashSuper_;
delete use;
}
} double GetResult(double money){
assert(pCashSuper_ != NULL);
return pCashSuper_->acceptCash(money);
}
private:
CashSuper *pCashSuper_;
std::size_t *use;
};

参考资料:

1. 大话设计模式

2. 设计模式:可复用面向对象软件的基础

Design Patterns---- Strategy 模式的更多相关文章

  1. Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  2. Design Patterns in Smalltalk MVC 在Smalltalk的MVC设计模式

    Design Patterns in Smalltalk    MVC在Smalltalk的MVC设计模式 The Model/View/Controller (MVC) triad ofclasse ...

  3. 设计模式(Design Patterns)Java版

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  4. Groovy 设计模式 -- Strategy 模式

    策略模式 https://en.wikipedia.org/wiki/Strategy_pattern In computer programming, the strategy pattern (a ...

  5. 设计模式C++实现(1)——策略(Strategy)模式

    目录 策略模式 应用案例 实现的关键 Talk is cheap,let's See The Code 设计思想 参考 策略模式 策略模式定义了一系列算法和行为(也就是策略),他们可以在运行时相互替换 ...

  6. 图书-软件架构:《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书)

    ylbtech-图书-软件架构:<Design Patterns: Elements of Reusable Object-Oriented Software>(即后述<设计模式&g ...

  7. Design Patterns in Android

    对日常在 Android 中实用设计模式进行一下梳理和总结,文中参考了一些网站和大佬的博客,如 MichaelX(xiong_it) .菜鸟教程.四月葡萄.IAM四十二等,在这里注明下~另外强烈推荐图 ...

  8. 【Design Patterns】(1)概述

    设计模式 -- 概述 2019-07-17  22:43:32  by冲冲 1. 简介 ① 设计模式 是软件开发人员在软件开发过程中,针对一般问题的最佳解决方案,该方案能够被程序员反复应用于解决类似问 ...

  9. .NET Best Practices: Architecture & Design Patterns (5 Days Training)

    .NET Best Practices: Architecture & Design Patterns (5 Days Training) .NET最佳实践:架构及设计模式 5天培训课程 课程 ...

  10. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

随机推荐

  1. mac svn

    开启svn服务:sudo svnserve -d -r /Users/fuyi/svnserver/mycode/

  2. Qt之线程基础

    何为线程 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据计算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例 ...

  3. vs版本的改变处理

    今天要用VS2010打开VS2013,一直觉得VS2010到VS2012只是界面上扁平化的改变,平台工具集有改变但很大程度上可能向上兼容.在网上搜了一些文章,其中有一篇说到一个观点:        从 ...

  4. (26)odoo中的序列运用

    * 模块中增加序列    __openerp__.py :    ...     'data': [        'product_data.xml',    ],    ...    ------ ...

  5. 你不知道的JavaScript--值得你挑战的JavaScript面试题(45题)

    1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2&qu ...

  6. 在进程View时的四个构造函数详解

    public View(Context context):源代码中的解释如下:在Code中实例化一个View就会调用第一个构造函数 /** * Simple constructor to use wh ...

  7. C#类和成员的修饰符

    C#中public.private.protected.internal.protected internal & (2010-09-22 13:33:45)转载 标签: 杂谈 分类: C# ...

  8. jquery添加的html元素按钮为什么不执行类样式绑定的click事件

    代码举例: 更多按钮: <input type="button" class="addMore" id="addMore${issue.id } ...

  9. Linux 下配置多机实时同步

    没钱的时候,用此方案做网站内容的负载均衡.异地备份,经济实惠又方便(仅针对网站文件做实时同步,如果数据库,则考虑mysql的多主架构) 一.机器配置及机房IP A机,位于杭州,IP: 115.33.2 ...

  10. linux 设置windows共享

    在linux下需要设置windows共享. 我们使用SMBA来实现. 1.查看是否安装smba. rpm -qa | grep samba 如果没有安装,则去 www.rpmfind.net 下载sm ...