一、策略模式的定义:
策略模式定义了一组算法,把其中的每个算法分别封装起来,并且使他们之间可以互换。策略模式使用的就是面向对象的继承和多态机制。
二、策略模式的组成部分:
1、一个抽象类,它是算法或策略的抽象,它定义的每个策略必须实现的方法和属性。
2、具体的实现类,就是具体的策略,根据具体情况有不同的实现,每个类的内部实现差别可能很大。
2、一个封装角色,可以做它为调度类,起承上启下的的作用,它屏蔽高层对策略的直访问,封装可能存在的变化。
三、接下来看一下代码示例:
#include <iostream>
using namespace std;
class Strategy //定义一个抽象的策略角色
{
public:
virtual void show() = 0;
};
class A : public Strategy //具体的策略角色A
{
public:
void show()
{
cout<<"我是策略A\n";
}
};
class B :public Strategy //具体的策略B
{
public:
void show()
{
cout<<"我是策略B\n";
}
};
class C :public Strategy //具体的策略C
{
public:
void show()
{
cout<<"我是策略C\n";
}
};
class Context //封装角色
{
private:
Strategy *StrategyChild;
public:
Context(Strategy *child)
{
StrategyChild = child;
}
void display()
{
StrategyChild->show();
}
};
void main()
{
Context *ContextA = new Context(new A); //调用角色A
ContextA->display();
Context *ContextB = new Context(new B); //调用角色B
ContextB->display();
Context *ContextC = new Context(new C); //调用角色C
ContextC->display();
system("pause");
}看一下执行结果
四、策略模式的优点:
1、算法可以自由切换,只要实现了抽象策略,它就是策略家族的一员,通过封装角色对其进行封装,保证对外提供”可自由切换“的策略。
2、避免使用多重条件判断,是系统更加灵活,并且易于扩展。
既然有优点,当然缺点也少不了:
1、每一个策略都是一个类,复用的可能性小,当策略众多时,类数量也是巨大的。
2、所有策略都必须对外暴漏,上层模块必须知道有哪些策略存在,才能知道,自己可以执行哪个策略,这与迪米特法则相违背。
五、策略模式的使用场景
1、多个类只在算法和行为上稍有不同的场景
2、算法需要自由切换的场景
3、需要屏蔽算法规则的场景
3742

被折叠的 条评论
为什么被折叠?



