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)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...
随机推荐
- VC++记录
1. 记录时间 #include <atlstr.h>#include <time.h>clock_t clockBegin, clockEnd; clockBegin = c ...
- FFmpeg简易播放器的实现-音视频同步
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- Git学习笔记3
git checkout 命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况: 一种是readme.txt自修改后还没有 ...
- 我的菜单在母版页,如何更改菜单点击后的效果 Ver2
很久之前,Insus.NET使用ASP.NET实现一个功能,非javascript.<我的菜单在母版页,如何更改菜单点击后的效果>http://www.cnblogs.com/insus/ ...
- MVC应用程序的jQuery代码重构
先看看这篇<在jQuery定义自己函数>http://www.cnblogs.com/insus/p/3415444.html 程序越看越是有重构的地方. 先看1部分,由于在#16代码有宣 ...
- Spring源码分析:Bean加载流程概览及配置文件读取
很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...
- Asp.Net WebForm生命周期的详解
一.Asp.Net页面生命周期的概念 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端IIS)发送一个request请求,服务器就会判断发送过来的请求页面,当完全识别 TTP页面处理程 ...
- 排查CentOS7.0的联网情况
1.ifconfig命令. 查看网络配置是否有问题 在/etc/sysconfig/network-scripts/ifcfg-ens33里面配置好网络,记住onboot=on这个选项一定要设置,不然 ...
- SWT table性能改善 -- 使用VirtualTable
在SWT程序中使用table展示数据时,如果数据过多,执行起来会比较慢,不过,我们可以借助VirtualTable来解决这一问题. Eclipse官网中关于VirtualTable的说明见:http: ...
- JavaOne 2016主旨演讲畅谈Java近期及远期规划
在 JavaOne 2016 主题演讲开场,来自 Oracle 的 Java 产品管理负责人 Sharat Chander 指出 Java 盛行于个人和工作的日常生活各个领域,无论是大数据.物联网甚至 ...