Strategy模式

来源:互联网 发布:个人可以注册cn域名吗 编辑:程序博客网 时间:2024/06/10 14:01

Strategy模式

问题

Strategy 模式和Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦。Strategy 模式将逻辑(算法)封装到一个类(Context)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。State 模式也有类似的功能,他们之间的区别将在讨论中给出。

模式选择

Strategy 模式典型的结构图为:



图1:Strategy Pattern 结构图
这里的关键就是将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再通过委托的方式将具体的算法实现委托给具体的Strategy 类来实现(ConcreteStrategeA类)。

实现

Strategy 模式实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码。
代码片断1:strategy.h
//strategy.h
#ifndef _STRATEGY_H_#define _STRATEGY_H_class Strategy{public:Strategy();virtual ~Strategy();virtual void AlgrithmInterface() = 0;protected:private:class ConcreteStrategyB:public Strategy{public:ConcreteStrategyB();virtual ~ConcreteStrategyB();void AlgrithmInterface();protected:private:};#endif //~_STRATEGY_H_
代码片断2:strategy.cpp

//Strategy.cpp#include "Strategy.h"#include <iostream>using namespace std;Strategy::Strategy(){}Strategy::~Strategy(){cout<<"~Strategy....."<<endl;}void Strategy::AlgrithmInterface(){}ConcreteStrategyA::ConcreteStrategyA(){}ConcreteStrategyA::~ConcreteStrategyA(){cout<<"~ConcreteStrategyA....."<<endl;}void ConcreteStrategyA::AlgrithmInterface(){cout<<"test ConcreteStrategyA....."<<endl;}ConcreteStrategyB::ConcreteStrategyB(){}ConcreteStrategyB::~ConcreteStrategyB(){cout<<"~ConcreteStrategyB....."<<endl;}void ConcreteStrategyB::AlgrithmInterface(){cout<<"test ConcreteStrategyB....."<<endl;}
代码片断3:Context.h

//Context.h#ifndef _CONTEXT_H_#define _CONTEXT_H_class Strategy;/***这个类是Strategy 模式的关键,也是Strategy 模式和Template 模式的根本*Strategy 通过“组合”(委托)方式实现算法(实现)的异构,而Template 模式则采取的是继承的方式*这两个模式的区别也是继承和组合两种实现接口重用的方式的区别*/class Context{public:Context(Strategy* stg);~Context();void DoAction();protected:private:Strategy* _stg;};#endif //~_CONTEXT_H_
代码片断4:Context.cpp
//Client.c//Context.cpp#include "Context.h"#include "Strategy.h"#include <iostream>using namespace std;Context::Context(Strategy* stg){_stg = stg;}Context::~Context(){if (!_stg)delete _stg;}void Context::DoAction(){_stg->AlgrithmInterface();}
代码片断5:main.cpp
//main.cpp#include "Context.h"#include "Strategy.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){Strategy* ps = new ConcreteStrategyA();Context* pc = new Context(ps);pc->DoAction();if (NULL != pc)delete pc;return 0;}

代码说明

Strategy 模式的代码很直观,关键是将算法的逻辑封装到一个类中。

讨论

可以看到Strategy 模式和Template 模式解决了类似的问题,也正如在Template 模式中分析的,Strategy 模式和Template 模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。这两种方式各有优缺点,先列出来:

1.继承

0 0
原创粉丝点击