Design Patterns---- Strategy 模式
设计模式:可复用面向对象软件的基础 书中对 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 模式的更多相关文章
- Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Design Patterns in Smalltalk MVC 在Smalltalk的MVC设计模式
Design Patterns in Smalltalk MVC在Smalltalk的MVC设计模式 The Model/View/Controller (MVC) triad ofclasse ...
- 设计模式(Design Patterns)Java版
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Groovy 设计模式 -- Strategy 模式
策略模式 https://en.wikipedia.org/wiki/Strategy_pattern In computer programming, the strategy pattern (a ...
- 设计模式C++实现(1)——策略(Strategy)模式
目录 策略模式 应用案例 实现的关键 Talk is cheap,let's See The Code 设计思想 参考 策略模式 策略模式定义了一系列算法和行为(也就是策略),他们可以在运行时相互替换 ...
- 图书-软件架构:《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书)
ylbtech-图书-软件架构:<Design Patterns: Elements of Reusable Object-Oriented Software>(即后述<设计模式&g ...
- Design Patterns in Android
对日常在 Android 中实用设计模式进行一下梳理和总结,文中参考了一些网站和大佬的博客,如 MichaelX(xiong_it) .菜鸟教程.四月葡萄.IAM四十二等,在这里注明下~另外强烈推荐图 ...
- 【Design Patterns】(1)概述
设计模式 -- 概述 2019-07-17 22:43:32 by冲冲 1. 简介 ① 设计模式 是软件开发人员在软件开发过程中,针对一般问题的最佳解决方案,该方案能够被程序员反复应用于解决类似问 ...
- .NET Best Practices: Architecture & Design Patterns (5 Days Training)
.NET Best Practices: Architecture & Design Patterns (5 Days Training) .NET最佳实践:架构及设计模式 5天培训课程 课程 ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
随机推荐
- centos nginx 安装
1.下载 wget http://nginx.org/download/nginx-1.7.8.tar.gz 2.解压 tar -zxvf nginx-1.7.8.tar.gz 3.切换目录 cd n ...
- VirtualBox – Error In supR3HardenedWinReSpawn 问题解决办法
转:http://chenpeng.info/html/3510---------VirtualBox – Error In supR3HardenedWinReSpawn---------<h ...
- 杂记(编程style)----google code style!
1.文件名 使用小写字母和下划线组合.头文件以.h结尾,定义文件用.cc结尾.例如:my_useful_class.cc 2.类型名 使用大写字母开头,多个单词组合时每个单词的首字母大写.例如:Url ...
- hdu-------1081To The Max
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Java 之 I/O 系列 01 ——基础
Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 整理<疯狂j ...
- jQuery+zTree加载树形结构菜单
jQuery+zTree加载树形结构菜单 由于项目中需要设计树形菜单功能,经过一番捣腾之后,终于给弄出来了,所以便记下来,也算是学习zTree的一个总结吧. zTree的介绍: 1.zTree 是利用 ...
- java二维数组简单初步理解
二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. int[][] arr = {{1, 2, 3}, {4, 5, 6}}; System.out.println(arr[0][ ...
- DB、ETL、DW、OLAP、DM、BI关系结构图
DB.ETL.DW.OLAP.DM.BI关系结构图 在此大概用口水话简单叙述一下他们几个概念: (1)DB/Database/数据库——这里一般指的就是OLTP数据库,在线事物数据库,用来支持生产的, ...
- Servlet+JSP+JavaBean开发模式(MVC)介绍
好伤心...写登陆注册之前看见一篇很好的博文,没有收藏,然后找不到了. 前几天在知乎上看见一个问题,什么时候感觉最无力. 前两天一直想回答:尝试过google到的所有solve case,结果bug依 ...
- java之io之File类的list()方法过滤目录的使用
java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果Fi ...