C++设计模式 ==> 策略模式与简单工厂模式结合
简介
策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略。且策略模式通过进一步封装了代码细节,没有像简单工厂模式那样在客户端创建详细的对象,而把任务交给了策略选择类去执行,所以客户端不会知道太多算法实现的细节。当然,在更多的情况下,策略模式一般可以与简单工厂模式并用,将进行策略选择的switch结构封装进策略选择类。
下面利用商场活动作为例子展示一段策略模式与简单工厂模式结合的代码,因为商场活动具体方案经常变化且种类繁多,所以适合策略模式的应用。
图示

代码实现
///////////////////////////////
//
// @Author : PeterZheng
// @FileName : StrategyDefine.h
// @Date : 2018-08-07 22:00
//
///////////////////////////////
#pragma once
#ifndef STRATEGYDEFINE
#define STRATEGYDEFINE
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <string>
#include <Windows.h>
#include <tchar.h>
#endif
//策略父类,抽象接口
class CashSuper
{
public:
virtual double AcceptCash(double&) = 0;
};
//正常收费类
class CashNormal :public CashSuper
{
public:
virtual double AcceptCash(double&);
};
//打折类
class CashRebate :public CashSuper
{
public:
CashRebate(double mr) :moneyRebate(mr) {}
virtual double AcceptCash(double&);
private:
double moneyRebate;
};
//满返类(例如 满100返20)
class CashReturn :public CashSuper
{
public:
CashReturn(double so, double targ) :moneySource(so), moneyTarget(targ) {}
virtual double AcceptCash(double&);
private:
double moneySource; //满xx
double moneyTarget; //返xx
};
//策略类
class CashContext {
public:
CashContext(const std::wstring& type)
{
if (type == _T("Normal"))
{
CashNormal *cn = new CashNormal(); //不打折
cs = cn;
}
else if (type == _T("Rebate"))
{
CashRebate *crb = new CashRebate(0.8); //打8折
cs = crb;
}
else if (type == _T("Return"))
{
CashReturn *crt = new CashReturn(300, 100); // 满300返100
cs = crt;
}
else
{
MessageBoxW(NULL, _T("Type Error !!"), _T("Warning"), MB_OK);
ExitProcess(0);
}
}
double GetResult(double money) //购买商品的原价
{
return cs->AcceptCash(money);
}
private:
CashSuper * cs = NULL;
};
//具体策略接口实现
double CashNormal::AcceptCash(double& money)
{
return money;
}
//具体策略接口实现
double CashRebate::AcceptCash(double& money)
{
return money * moneyRebate;
}
//具体策略接口实现
double CashReturn::AcceptCash(double& money)
{
if (money >= moneySource)
{
return money - moneyTarget;
}
return money;
}
///////////////////////////////
//
// @Author : PeterZheng
// @FileName : StrategyModeDemo.cpp
// @Date : 2018-08-07 22:00
//
///////////////////////////////
#include "StrategyDefine.h"
using namespace std;
int _tmain(void)
{
CashContext *cscNom = new CashContext(_T("Normal"));
CashContext *cscReb = new CashContext(_T("Rebate"));
CashContext *cscRet = new CashContext(_T("Return"));
wcout.imbue(std::locale("chs"));
wcout << _T("不打折情况:") << cscNom->GetResult(1300) << endl;
wcout << _T("打折情况:") << cscReb->GetResult(1300) << endl;
wcout << _T("满反情况:") << cscRet->GetResult(1300) << endl;
system("pause");
return 0;
}
C++设计模式 ==> 策略模式与简单工厂模式结合的更多相关文章
- 设计模式之策略模式&简单工厂模式
学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...
- 设计模式(二)简单工厂模式(Simple Factory Pattern)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...
- C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式
1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- 设计模式(3)--SimpleFactory( [1] 简单工厂模式)--创建型
1.模式定义: 简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 2.模式特点: 实现方式的 ...
- Java设计模式:Simple Factory(简单工厂)模式
概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...
随机推荐
- (转)mybatis热加载(依赖mybatis-plus插件)的实现
最近在使用mybatis,由于是刚刚开始用,用的并不顺手,目前是感觉有2个地方非常的不好用: 1.mybatis调试不方便 由于dao层只有接口,实现只是一个map的xml文件,想加断点都没有地方加, ...
- es6学习笔记1
最近在阅读<探索es6>,就把自己认为重要的做一点笔记,方便日后学习. 1.获取更多的es6资源的办法 有两组 ES6 资源: “ ECMAScript 6 Tools ”,作者 Addy ...
- windows开机提示文件损坏
今早按部就班的开机,然后准备吃热干面,很多时候事情都是同步进行的... 然后眼前出现这样一个界面 心情果断灰暗下来,按照提示一步步操作,点enter进入高级选项,试过了安全模式启动.最后一次正确配置启 ...
- Netty 源码剖析之 unSafe.write 方法
前言 在 Netty 源码剖析之 unSafe.read 方法 一文中,我们研究了 read 方法的实现,这是读取内容到容器,再看看 Netty 是如何将内容从容器输出 Channel 的吧. 1. ...
- vs2013 在win7下,使用c++创建项目各种报错问题解决方案
错误1:提示缺少mfc100ud.dll 错误2:win7 vs2013 mfc程序找不到sdkddkver.h 错误3:error LNK1158: 无法运行“rc.exe” 等等; 在网上搜了好久 ...
- More Effective C++ 35 条款
一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...
- 浅谈sql中的in与not in,exists与not exists的区别以及性能分析
1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...
- thinkphp ajax删除 隐藏与显示
知识点: 1.ajax删除: 2.一个同步实现三个异步的效果. html 部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...
- 一.JDK版本切换批处理脚本
我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,这时候我们可能会在一台电脑上安装多个版本的JDK,如下图所示:
- myeclipse或eclipse无法从wtpServer添加tomcatServer
在eclipse想把之前的Tomcat 6删掉,重新配置一个,不料没有下一步 Cannot create a server using the selected type 这句话出现在窗口上面,应该不 ...