设计模式(4)--对象行为(9)--策略

本文介绍了策略模式在C++中的应用,包括定义抽象策略和具体策略,上下文环境的角色,以及其优点(如算法重用、灵活性和多样性)和缺点(如客户理解复杂性、开销和对象数量增加)。通过代码示例展示了如何使用策略模式来替换继承并提供不同实现。
摘要由CSDN通过智能技术生成
1. 意图

    定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。

    本模式使得算法可独立于使用它的客户而变化。

2. 三种角色

   抽象策略(Strategy)、具体策略(Concrete Strategy)、上下文环境(Context)

3. 优点

    3.1 可重用的相关算法系列。

    3.2 一个替代继承的方法,算法独立于Context。

    3.3 消除了一些条件语句。

    3.4 提供了相同行为的不同实现。

4. 缺点

    4.1 客户必须了解不同的策略。

    4.2 Strategy和Context之间的通信开销。

    4.2 增加了对象的数目。

5. 相关模式

    5.1 策略对象经常的轻量级的享元对象

6. 代码示意(C++)
#pragma once
class Strategy
{
public:
	virtual int Algorithm(int a, int b) = 0;
};

class StrategyA :public Strategy
{
public:
	virtual int Algorithm(int a, int b) {
		return a + b;
	}
};
class StrategyB :public Strategy
{
public:
	virtual int Algorithm(int a, int b) {
		return a - b;
	}
};


class Context
{
	Strategy* m_pStrategy;
public:
	Context(Strategy* pStrategy) {
		m_pStrategy = pStrategy;
	}
	~Context() {
		delete m_pStrategy;
	}
	int GetResult(int a, int b)
	{
		return m_pStrategy->Algorithm(a, b);
	}

};

template <class AStrategy>
class Context2
{
public:
	int GetResult(int a, int b)
	{
		return theStrategy.Algorithm(a, b);
	}
private:
	AStrategy theStrategy;
};
#include "Strategy.h"
int main() {
	//1. 传参方式
	Context* pContext = new Context(new StrategyA());
	cout << "result:" << pContext->GetResult(8, 2) << endl;
	delete pContext;

	pContext = new Context(new StrategyB());
	cout << "result:" << pContext->GetResult(8, 2) << endl;
	delete pContext;

	//2.模板类
	Context2<StrategyA> aContext;
	cout << "result:" << aContext.GetResult(8, 2) << endl;
	return 0;
}

运行结果:

  6.1 很容易实现StrategyC,策略替代很方便(3.2)

  6.2 不需要判断语句来选择哪种策略(3.3)

  6.3 相同的接口,但可得到不同的结果(3.4)

  6.4 使用模板类时,具体策略可以不继承自抽象Strategy。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值