设计模式(4)--对象行为(9)--策略
2023-12-30 15:49:10
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。
文章来源:https://blog.csdn.net/myepicure/article/details/134910206
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!