策略模式
策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
意图
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用
一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决
将这些算法封装成一个一个的类,任意地替换。
关键代码
实现同一个接口。
应用实例
优点
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
缺点
- 策略类会增多。
- 所有策略类都需要对外暴露。
使用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项
如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
实现
#include "pch.h"
#include <iOStream>
class Strategy
{
public:
virtual int DoOperation(int num1, int num2) = 0;
};
class OperationAdd : public Strategy
{
public:
virtual int DoOperation(int num1, int num2)
{
return num1 + num2;
}
};
class OperationSubstract : public Strategy
{
public:
virtual int DoOperation(int num1, int num2)
{
return num1 - num2;
}
};
class OperationMultiply : public Strategy
{
public:
virtual int DoOperation(int num1, int num2)
{
return num1 * num2;
}
};
class Context
{
public:
Context(Strategy* strategy) {
this->strategy = strategy;
}
int ExecuteStrategy(int num1, int num2) {
return strategy->DoOperation(num1, num2);
}
private:
Strategy* strategy;
};
int main()
{
Context* context = new Context(new OperationAdd());
std::cout << "10 + 5 = " << context->ExecuteStrategy(10, 5) << std::endl;
context = new Context(new OperationSubstract());
std::cout << "10 - 5 = " << context->ExecuteStrategy(10, 5) << std::endl;
context = new Context(new OperationMultiply());
std::cout << "10 * 5 = " << context->ExecuteStrategy(10, 5) << std::endl;
}
>>>
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
文章最后发布于: 2019-06-03 21:03:10
相关阅读
随着社会经济的发展以及互联网技术的成型,在线教育从几年前的“精英消费”逐渐走入了寻常百姓家,据相关数据显示,在线教育
2011年,微博跃升为中国最大的舆论平台。 2012年,它成为大陆网民获取信息的第一个平台,企业微博营销也成了火。当时,笔者恰好是一个着
随着淘宝红利的消失,淘宝进入了后电商时代,也出现了新的局面。货源代发并不一定是百分百安全的,存在淘宝一件代发货源骗局,关键还是要
内容营销策略、内容策略、内容计划是三个不同的词语,对于这三个词语大家经常互相通用,但是在我看来这三个词语有不同的含义:内容营销
仅适用于Steam饥荒联机版 服务配置修改 修改 saveindex 文件 ..\Klei\DoNotStarveTogether\client_save\saveindex ... se