设计模式之策略模式
策略模式定义算法家族,分别封装。它们之间可以相互替换,让算法变化,不会影响到用户。优点:适合类中的成员方法为主,算法经常变动;简单了单元测试(因为每个算法都有自己的类,可以通过自己的接口单独测试)。缺点:客户端需要做出判断。
其UML图如下:
策略模式和简单工厂模式非常相似。具体来讲有个细微的区别就是,简单工厂模式需要根据传递过来的条件判断创建什么样的对象。而策略模式是直接传递给Context一个对象,至于传递什么类型的对象则是需要用户自己去判断。从这一点来讲策略模式遵从了开放-封闭原则,当需要添加不同的算法的时候只需要添加一个算法类就可以了,并不用去修改Context类。而简单工厂模式则破坏了开放-封闭原则,当需要添加不同的对象时候,不仅需要添加响应的类,还需要修改工厂类。这一点无所谓好与坏,主要还是看需求。这两种模式也经常结合起来使用,因为策略模式需要根据需求判断生成算法类对象,而这一部分可以封装成一个简单工厂模式。另一方面,简单工厂模式主要解决的是对象创建问题,而策略模式主要解决的是经常变动算法的问题。
策略模式与简单工厂模式相结合给出的四则运算的示例代码如下:
// StrategyModel.h文件
#pragma once
// 操作基类
template<typename T>
class Operation
{
public:
Operation(T lpa, T rpa);
virtual T getResult() = 0;
protected:
T lpa, rpa;
};
template<typename T>
Operation<T>::Operation(T lpa, T rpa)
{
this->lpa = lpa;
this->rpa = rpa;
}
// 加法类
template<typename T>
class AddOperation : public Operation<T>
{
public:
AddOperation(T lpa, T rpa) : Operation<T>(lpa, rpa){
}
T getResult()
{
return this->lpa + this->rpa;
}
};
// 减法类
template<typename T>