设计模式C++实现二:策略模式

策略模式(strategy): 定义算法家族,分别封装起来,让这些算法直接可以相互替换,我们可以自由添加或者修改算法而不会影响客户.

优点:简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

如果我们在客户端为了判断使用哪个算法而使用switch语句来分析,我们可以使用策略模式把这个判断的过程隐藏到后台,把每个算法用一个strategy类实现。这样就简化了客户端的代码,也隐藏了实现的细节。

#ifndef STRATEGY_H
#define STRATEGY_H
#include<iostream>
using namespace std;
class CashSuper
{
	friend class CashContext;
protected:
	virtual double acceptCash(double money) = 0;
};

/*工厂模式
class CashContext
{
	CashSuper *cs;
public:
	CashContext(CashSuper *cashs) :cs(cashs){}
	void operator =(CashSuper * re)
	{
		cs = re;
	}
	double GetResult(double money)
	{
		return cs->acceptCash(money);
	}
};*/
class CashContext
{
	CashSuper *cs;
	char StrategyType;
public:
	CashContext(){}
	CashContext(char &SType);
	void operator =(char &SType);
	double GetResult(double money)
	{
		if (cs == NULL){ cout << "The strategy is unfind."; return -1; }
		return cs->acceptCash(money);
	}
};
class CashNormal:public CashSuper
{
	//friend class CashContext;
public:
	double acceptCash(double money)
	{
		return money;
	}
};

class CashRebate:public CashSuper
{
	//friend class CashContext;
	double Rebate;
public:
	CashRebate(double discount) :Rebate(discount){}
	double acceptCash(double money)
	{
		return money*Rebate;
	}
};

class CashReturn :public CashSuper
{
	//friend class CashContext;
	double baseCash,returnCash;
public:
	CashReturn(double baseC,double returnC) :baseCash(baseC),returnCash(returnC) {}
	double acceptCash(double money)
	{
		if (money >= baseCash) return money - returnCash;
		return money;
	}
};

CashContext::CashContext(char &SType) :StrategyType(SType)
{
	switch (StrategyType)
	{
	case('a') :
	case('A') :
			  cs = new CashNormal;
		break;
	case('b') :
	case('B') :
			  cs = new CashRebate(0.8);
		break;
	case('c') :
	case('C') :
			  cs = new CashReturn(1000, 200);
		break;
	default:
		cs = NULL;
		break;
	}
}
void CashContext::operator =(char &SType)
{
	StrategyType = SType;
	switch (StrategyType)
	{
	case('a') :
	case('A') :
			  cs = new CashNormal;
		break;
	case('b') :
	case('B') :
			  cs = new CashRebate(0.8);
		break;
	case('c') :
	case('C') :
			  cs = new CashReturn(1000, 200);
		break;
	default:
		cs = NULL;
		break;
	}
}

#endif
#include"strategy.h"
int main()
{
	double ShouldPay = 1520;
	/*   简单工厂模式的实现,下面的三种策略的细节暴露在客户端
	CashNormal cashn;
	CashRebate cashrb(0.95);
	CashReturn cashrt(1000, 200);
	CashContext cashC(&cashn);
	cout << "The real pay is : " << cashC.GetResult(ShouldPay) << endl;
	cashC=&cashrb;
	cout << "The real pay is : " << cashC.GetResult(ShouldPay) << endl;
	cashC=&cashrt;
	cout << "The real pay is : " << cashC.GetResult(ShouldPay) << endl;
	*/
	//下面实现的是用策略模式实现的,其付款细节在客户端是不可见的,如果要添加或者删除策略
	//我们可以在strategy.h中添加该策略类,然后把这个类添加到CashContext中实现,这样在客户端
	//很少要修改信息,实现细节的隐藏
	cout << "Please enter the strategy type,'a' or 'A' instand the normalcash ,\n"
		<< "'b' or 'B' instand the rebatecash, 'c' or 'C' instand the returncash.\n";
	char type;
	CashContext cashC;
	while (cin >> type)
	{
		cashC = type;
		cout << "The real pay is : " << cashC.GetResult(ShouldPay) << endl;

	}
	return 0;
}

如需转载,请注明出处。

时间: 2025-01-03 00:51:41

设计模式C++实现二:策略模式的相关文章

C#设计模式之十九策略模式(Stragety Pattern)【行为型】

原文:C#设计模式之十九策略模式(Stragety Pattern)[行为型] 一.引言 今天我们开始讲"行为型"设计模式的第七个模式,该模式是[策略模式],英文名称是:Stragety Pattern.在现实生活中,策略模式的例子也非常常见,例如,在一个公司中,会有各种工作人员,比如:有的是普通员工,有的是软件架构师,有的是部门经理,当然也会有公司的CEO.这些工作人员负责的工作不同,担负的责任不同,自然得到的报酬也就不同了.每种工作人员都有自己的工资,但是每个工种的工作人员的工资的

Java设计模式(七)策略模式 模板模式

(十三)策略模式 策略模式定义了多个封装起来的算法,封装的算法可以相互替换,并且算法的变化不会影响到使用算法的客户.借用另一位大神的例子. interface ICalculator{ public int calculate(String exp); } abstract class AbstractCalculator{ public int[] split(String exp,String opt){ String array[] = exp.split(opt); int arrayI

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接

&amp;lt;二&amp;gt;读&amp;lt;&amp;lt;大话设计模式&amp;gt;&amp;gt;之策略模式

又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.client依赖两个类.耦合性高:2.假设算法过多则须要写非常多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族.分别封装起来.让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单位价格*打

设计模式(一)策略模式

1.什么是策略模式? 策略模式,又叫算法簇模式,就是定义了不同的算法簇,并且之间可以互相替换,此模式算法的变化独立于使用算法的客户. 2.策略模式有什么好处? 策略模式的好处在于你可以动态改变对象的行为. 3.设计原则 设计原则是把一个类中经常改变或者将来改变的部分提取出来,作为一个接口(C++中可以用抽象类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现这个接口的类的行为. 策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口(C++中即为抽象基

Java设计模式菜鸟系列(一)策略模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563 今天开始咱们来谈谈Java设计模式.这里会结合uml图形来讲解,有对uml建模不熟的可以参考我的另一篇博文uml建模. 首先,个人觉得模式的设计就是一个将变化的东西和不变(稳定)的东西分离的过程.咱们的应用中可能有很多需要改变的地方,而模式要做的就是把它们"抽取"出来并进行"封装"和"实现",因此更多的时候咱们是面向接口编程

设计模式解读之一: 策略模式

1. 模式定义 把会变化的内容取出并封装起来,以便以后可以轻易地改动或扩充部分,而不影响不需要变化的其他部分: 2. 问题缘起当涉及至代码维护时,为了复用目的而使用继承,结局并不完美.对父类的修改,会影响到子类型.在超类中增加的方法,会导致子类型有该方法,甚至连那些不该具备该方法的子类型也无法免除.示例,一个鸭子类型: public abstract class Duck {    //所有的鸭子均会叫以及游泳,所以父类中处理这部分代码    public void quack() {     

head first 设计模式读书笔记 之 策略模式

作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php加入了面向对象的阵型之后,很多开发者开始使用了oop思想来写代码,php也变得越来越标准,越来越规范.而其中,设计模式起到了不小的作用.最近老大找我谈话,说php这边的开发模块耦合度过高,代码感觉质量不高,想来一次代码重构行动.我对代码重构也是一知半解,而代码重构的基础就是去了解设计模式,于是我翻起

设计模式22:Strategy 策略模式(行为型模式)

Strategy 策略模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也是一个性能负担. 如何在运行时根据需要透明地更改算法?将算法与对象本身解耦,从而避免上述问题? 意图(Intent) 定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换.该模式使得算法可以独立于使用它的客户而变化.——<设计模式>GoF 示例代码 enum CartType