简介

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

    复制的作用 l  水平扩展 l  数据备份 l  数据分析 l  数据分布 l  高可用性 复制的工作原理 Mariadb的复制功能是基于binlog进行的.复制的工作主要是由主库上Master du ...

  2. CRM项目图形交互界面设计

    由于我们组在刚开始的时候 ,进度比较快的!老师本来是打算最后给我们用统一的学校已经封装好的界面给我们的!看着我们的现实都写完了!老师就提前把界面都给我们了!但是觉得界面一般,不怎么好看!我们就全部都是 ...

  3. CRM项目分析建表

    这个CRM项目是我们学习一年多以来,第一次团队合作完成的项目!之前的项目都是做半个月的,但是都是自己单独完成一套项目的!这次我们还是做半个月的!但是我们是分工合作的!自己所完成的内容都是不同的!我觉得 ...

  4. vue的项目优化---回顾

    陆陆续续也用vue开发或重构了不少项目,在这期间遇到不少的坑,也尝试过优化.在此记录一下,想到一点算一点吧: 一.尽可能的减少watcher的数量   当监听数据是一个对象的时候,最好具体到监听对象的 ...

  5. ActiveMQ专题2: 持久化

    AMQ的持久化问题 前言 ​ 前面一篇AMQ专题中,我们发现对于Topic这种类型的消息,即使将deliveryMode设置为持久化,只要生产者在消费者之前启动.消息生产者发布的消息还是会丢失.这是符 ...

  6. 并发编程 —— ScheduledThreadPoolExecutor

    1. 前言 在前面的文章中,我们介绍了定时任务类 Timer ,他是 JDK 1.3 中出现的,位于 java.util 包下.而今天说的 ScheduledThreadPoolExecutor的是在 ...

  7. el-upload源码跳坑2

    产品又加了一个需求,要求删除图片时候弹一个提示框,如果确定就直接发请求从服务器删除图片 ​ 一开始想的比较简单,直接在on-remove的钩子函数上做弹框提示,如果取消就撤销,代码如下: <el ...

  8. 【MongoDB-query查询条件】

    在上一篇中简要使用了C# 对MongoDB进行数据操作,这里补充一些MongoDB query查询条件文档: Query.All("name", "a",&qu ...

  9. (转).net平台下垃圾回收机制

    引言:使用c++进行编程,内存的处理绝对是让每个程序设计者最头疼的一块了.但是对于.net平台下使用c#语言开发系统,内存管理可以说已经不算是问题了.在.net平台下CLR负责管理内存,CLR中的垃圾 ...

  10. 利用netty简单实现聊天室

    1.导入依赖包 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</a ...