简介

策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略。且策略模式通过进一步封装了代码细节,没有像简单工厂模式那样在客户端创建详细的对象,而把任务交给了策略选择类去执行,所以客户端不会知道太多算法实现的细节。当然,在更多的情况下,策略模式一般可以与简单工厂模式并用,将进行策略选择的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++设计模式 ==> 策略模式与简单工厂模式结合的更多相关文章

  1. 设计模式之策略模式&amp;简单工厂模式

    学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...

  2. 设计模式(二)简单工厂模式(Simple Factory Pattern)

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...

  3. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  4. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  5. C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...

  6. C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式

    1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...

  7. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  8. 设计模式(3)--SimpleFactory( [1] 简单工厂模式)--创建型

    1.模式定义: 简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 2.模式特点: 实现方式的 ...

  9. Java设计模式:Simple Factory(简单工厂)模式

    概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...

随机推荐

  1. es6学习笔记7--Set

    Set 基本用法 ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数,用来生成Set数据结构. var s = new Set(); [2, ...

  2. js实现响应式瀑布流

    导读:瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pinterest ...

  3. React多页面应用脚手架-v1.3.0

    react-multi-page-app是一个基于react和webpack的多页面应用架构,通过编译生成对应目录结构清晰的静态页面,实现多页面便捷开发维护.1.3.0 版本对项目整体做了一个全面的升 ...

  4. 基于Spring Security2与 Ext 的权限管理设计与兑现

    基于Spring Security2与 Ext 的权限管理设计与实现 一.Spring Security介绍 Spring Security的前身Acegi,其配置及使用相对来说复杂一些,因为要配置的 ...

  5. [日常] Go语言圣经-可变参数习题

    1.参数数量可变的函数称为为可变参数函数,例子就是fmt.Printf和类似函数2.参数列表的最后一个参数类型之前加上省略符号“...”3.虽然在可变参数函数内部,...int 型参数的行为看起来很像 ...

  6. xshell提示采购解决方法

    参考http://blog.csdn.net/longgeaisisi/article/details/78637179

  7. SPOJ7001(SummerTrainingDay04-N 莫比乌斯反演)

    Visible Lattice Points Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at ...

  8. Flex 常用布局

    1.flex布局 1.1  容器指定为flex布局 .box{display: flex;} 1.2 行元素指定flex布局 .box{display:inline-flex} 2.容器的属性 2.1 ...

  9. Dynamics 365Online Server-Side OAuth身份认证

    在上篇演示了在html页面中通过调用online的OAuth身份验证后再通过web api取10条客户数据并展示,本篇继续讲述如何在server-side程序中调用online的OAuth认证再通过w ...

  10. MyEclipse中搭建Struts2开发环境

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53205941 冷血之心的博客) 在MyEclipse中如何搭建St ...