Strategy模式
来源:互联网 发布:个人可以注册cn域名吗 编辑:程序博客网 时间:2024/06/10 14:01
Strategy模式
问题
Strategy 模式和Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦。Strategy 模式将逻辑(算法)封装到一个类(Context)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。State 模式也有类似的功能,他们之间的区别将在讨论中给出。模式选择
Strategy 模式典型的结构图为:这里的关键就是将算法的逻辑抽象接口(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
- strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- STRATEGY 模式
- Strategy 模式
- Strategy模式
- strategy模式
- Strategy模式
- Strategy 模式
- Strategy 模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- POJ 2686 - Y2K Accounting Bug
- 在织梦DedeCms的搜索框里显示提示信息
- UEditor学习笔记(二)
- 在Linux上搭建PHP条形码阅读器
- 进入织梦DedeCms数据库删除指定IP的所有评论
- Strategy模式
- 大话数据结构 -- 第九章 排序
- 织梦DedeCms获取文章URL地址的方法
- 移动互联网时代的创业生存法则:快速试错,廉价失败
- Tomcat学习之Request/Response封装
- hdu 1584 蜘蛛牌(dfs)
- 织梦DedeCms鼠标移到标题处显示完整标题
- 2016年7月25日任务
- 美式英语口语规则