记得在中学时代,每次考完老师评讲试卷,都会说这道题有多少种解法,然后在黑板上板书第一种、第二种解法。其实这个情况就类似于今天的情况,也就是策略模式。他表示的是在遇到一种问题有多种解法的时候,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。
策略模式是一种相对来说较简单的模式,但是应用却很广泛。在我们写代码的时候,很容易就会写出比较糟糕的、扩展性差的代码,而策略模式往往是重构的时候会用到的一种方法。策略模式基本上就是多态技术的直接应用,因此比较容易理解。
我们在写代码的时候很容易写出if else或者switch case这种代码,但是这种代码的扩展性较差,增加一个新功能就得修改很多if else或者switch case。而策略模式就是解决这种问题的有效方法。
class Shape{//多态实现if判断项动态变化
public:
virtual void doSomething() = 0;
virtual ~Shape();
};
class Rectangle :public Shape {
public:
void doSomething() {
//if判断项抽象为一个子类,算法1
}
};
class Triangle :public Shape {
public:
void doSomething() {
//if判断项抽象为一个子类,算法2
}
};
class Strategy {//“稳定”的部分抽象出来
public:
Shape* _shape;
Strategy() {
_shape = new Triangle();
_shape->doSomething();
}
};
策略模式本身比较简单,没有太多可以说的,不过策略模式和状态模式非常像,有必要说一下两者的区别:
策略模式只是条件性的选择方法,只执行一次方法,而状态模式是随着状态的改变不停地更改执行方法。举个例子,就好比我们旅游,对于策略模式我们只需要选择其中一种出行方法就好了,但是状态模式不一样,可能我们到了A地点选择的是火车,到了B地点又选择飞机,根据不同的状态选择不同的出行方式。