- 介绍:策略模式,行为型模式之一。策略模式可以定义一个算法族,把一系列算法封装起来并提供一个统一接口,这样算法之间的切换或其他变化不会影响客户端。其关键在于,把算法的抽象接口封装在一个类中,算法的实现由具体策略类来实现,,而算法的选择由客户端决定。
- 策略模式结构:
(1)抽象策略类:定义算法族的统一接口;
(2)具体策略类:实现了具体的算法操作;
(3)上下文:包含一个策略类的引用,根据不同策略执行不同操作,策略的选择由客户端决定;
1、策略模式代码实现
#include <iostream>
/*
策略模式
*/
// 计算接口(抽象策略类)
class Calculate{
public:
virtual void caculate(int a, int b) = 0;
};
// 加法计算(具体策略类)
class Addition : public Calculate{
public:
virtual void caculate(int a, int b){
std::cout<<"a + b = "<<a + b<<std::endl;
}
};
// 减法计算(具体策略类)
class Subtraction : public Calculate{
public:
virtual void caculate(int a, int b){
std::cout<<"a - b = "<<a - b<<std::endl;
}
};
// 根据不同选择执行不同策略(上下文类)
class Context{
public:
Context(Calculate* calcu){
p_calcu = calcu;
}
void select_calcu(int a, int b){
p_calcu->caculate(a, b);
}
private:
Calculate* p_calcu;
};
int main(void){
// 创建加法策略,执行加法
Calculate* p_cal = new Addition;
Context* p_con = new Context(p_cal);
p_con->select_calcu(3,4);
delete p_cal;
delete p_con;
// 创建减法策略,执行减法
p_cal = new Subtraction;
p_con = new Context(p_cal);
p_con->select_calcu(10,5);
delete p_cal;
delete p_con;
return 0;
}
2、优缺点:
2.1、优点
(1)策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
(2)策略模式提供了管理相关的算法族的办法。
(3)策略模式提供了可以替换继承关系的办法。
(4)使用策略模式可以避免使用多重条件转移语句。
2.2、缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
(2)策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
3、使用场景
(1)如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
(2)一个系统需要动态地在几种算法中选择一种。
(3)如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
(4)不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。