设计模式_16 策略模式
16 策略模式
16.1 概念
该模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同对象对这些算法进行管理。
16.2 结构
抽象策略类:通常由一个接口或抽象类来实现。此角色给出所有具体策略所需要的接口。
具体策略类:实现抽象策略类定义的接口,提供具体的算法或实现行为。
环境类:持有一个策略类的引用,供客户端调用。
16.3 实现
16.3.1 UML图
16.3.2 代码
#include<iostream>
#include<string>
using namespace std;
class Function {
public:
virtual void show() = 0;
};
class FunctionA : public Function {
public:
void show() {
cout << "方案一" << endl;
}
};
class FunctionB : public Function {
public:
void show() {
cout << "方案二" << endl;
}
};
class FunctionC : public Function {
public:
void show() {
cout << "方案三" << endl;
}
};
class Manager {
private:
Function* func;
public:
Manager(Function* func) {
this->func = func;
}
void selectFunction() {
func->show();
}
};
int main() {
Manager* manager = new Manager(new FunctionA());
manager->selectFunction();
manager = new Manager(new FunctionB());
manager->selectFunction();
return 0;
}
16.4 优缺点
16.4.1 优点
策略之间可以自由切换。
易于扩展。
避免使用多重条件语句(if-else),充分体现面向对象思想。
16.4.2 缺点
客户端必须知道所有策略类,并自行决定使用哪种策略。
策略模式将造成产生很多策略类,可以通过享元模式在一定程度上减少对象的数量。
16.5 使用场景
一个系统需要动态的在几种算法之间选择时,可将每个算法封装到策略类中。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入策略类中。
系统中各算法彼此完全独立,且要求对客户隐藏具体的算法实现细节。