策略模式

来源:互联网 发布:齐天大圣 知乎 编辑:程序博客网 时间:2024/05/21 08:47

一、策略模式的定义:

策略模式定义了一组算法,把其中的每个算法分别封装起来,并且使他们之间可以互换。策略模式使用的就是面向对象的继承和多态机制。


二、策略模式的组成部分:

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);   //调用角色AContextA->display();Context *ContextB = new Context(new B);   //调用角色BContextB->display();Context *ContextC = new Context(new C);   //调用角色CContextC->display();system("pause");}
看一下执行结果




四、策略模式的优点:

1、算法可以自由切换,只要实现了抽象策略,它就是策略家族的一员,通过封装角色对其进行封装,保证对外提供”可自由切换“的策略。

2、避免使用多重条件判断,是系统更加灵活,并且易于扩展。

既然有优点,当然缺点也少不了:

1、每一个策略都是一个类,复用的可能性小,当策略众多时,类数量也是巨大的。

2、所有策略都必须对外暴漏,上层模块必须知道有哪些策略存在,才能知道,自己可以执行哪个策略,这与迪米特法则相违背。


五、策略模式的使用场景

1、多个类只在算法和行为上稍有不同的场景

2、算法需要自由切换的场景

3、需要屏蔽算法规则的场景


0 0
原创粉丝点击