设计模式之策略模式

背景:当需要完成某一个功能时,在不同的条件下,会有不同的实现方法。比如要计算税率,不同国家有不同的计算方法。

如果将这些不同的实现都放在一个类中:
一是造成代码复杂,难以维护。
二是如果添加新条件下的不同实现方法,需要重新修改源代码,可能造成意料之外的问题,并且难度会很大。同时也不符合开闭原则:对拓展开放,对修改关闭。
三是这个类的不同对象在使用时,可能只会使用到其中一种方法,导致时间复杂度变高,因为需要在所有方法中去找到适合的方法。

解决办法:将这些方法剥离出来,使用一个类作为所有方法的基类,不同方法作为子类去继承这个基类,由每个子类分别实现一种方法,这个类称之为策略。满足了开闭原则。 当需要有新的实现方法时,只用再添加一个策略类即可。

实例

#include <iostream>

using namespace std;

class BaseStrategy{
	public:
		virtual void caculate() = 0;
		virtual ~BaseStrategy(){}
};

class StrategyA: public BaseStrategy{
	public:
		virtual void caculate(){
			cout << "用策略A计算" << endl; 
		}
};

class StrategyB: public BaseStrategy{
	public:
		virtual void caculate(){
			cout << "用策略B计算" << endl;
		}
};

// 使用组合的方式,类中有一个策略的对象。
// 由对象决定使用哪种策略 
class Context{
	private:
		BaseStrategy *strategy;
	public:
		Context(BaseStrategy *strategy){
			this->strategy = strategy;
		}
		void solve(){
			strategy->caculate();
		}
		~Context(){
			if(strategy)
				delete strategy;
		}
};

int main(void)
{
	// 产生不同的策略对象 
	BaseStrategy *strategyA = new StrategyA();
	BaseStrategy *strategyB = new StrategyB();
	
	// 创建对象,面对不同条件,选择不同的策略 
	Context *contextA = new Context(strategyA);
	Context *contextB = new Context(strategyB);
	
	// 产生不同的效果 
	contextA->solve();
	contextB->solve();
	return 0;
}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值