简介

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

    最近在搞跨平台解决方案,讨论关于模块划分的问题以及如何尽量多的复用逻辑代码.于是就有了此文章,之前的博客也写过,不过由于主机商跑路,宝贵的资源也就没了,说多了都是泪~ 这里按模块化发展的历史回溯的时间 ...

  2. Python 工匠:编写条件分支代码的技巧

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 作者:朱雷 | 腾讯IEG高级工程师 『Python 工匠』是什么? 我一直觉得编程某种意义是一门『手艺』 ...

  3. Nginx+uwsgi+Django 的web应用环境部署-完整记录

    Python作为当前最火爆最热门,也是最主要的Web开发语言之一,在其二十多年的历史中出现了数十种Web框架,比如Django.Tornado.Flask.Twisted.Bottle和Web.py等 ...

  4. Linux的僵尸进程及其解决方法

    1. 产生原因: 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.通过ps命令查看其带有defunct的标志.僵尸进程是一个 ...

  5. What is AMQP? and the architecture

    What is AMQP? (Advanced Message Queuing Protocol) When two applications need to communicate there ar ...

  6. Oracle空表导出

    执行: Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 执行该命令后产 ...

  7. 转载--Json转换

    JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式,为什么没 ...

  8. ThinkPHP5微信扫码支付

    1.把微信官网下载的demo放在根目录/vendor/目录下,这里我的是/vendor/wxpay_pc目录 2.把cert里面的文件替换成自己项目的证书(登陆微信商户平台,账户中心,API安全下载) ...

  9. 洛谷P4054 [JSOI2009]计数问题(二维树状数组)

    题意 题目链接 Sol 很傻x的题.. c才100, n, m才300,直接开100个二维树状数组就做完了.. #include<bits/stdc++.h> using namespac ...

  10. 安装nvm管理不同的node版本

    在工作或者学习中,偶尔会遇到需要切换不同node版本的需求,幸好有神器nvm可以帮我们解决问题.下面我们就来讲解如何在window系统上安装nvm!