Strategy模式

Strategy模式要解决的问题和Template模式类似。都是为了把算法的声明和算法的实现解耦。Template模式是通过继承来实现的,而Strategy模式是通过组合来实现的。

Strategy模式将算法封装到一个类(Context)里面。通过组合的方式将算法在组合的对象中实现。之后通过托付将抽象接口托付给组合对象来实现。其类结构图例如以下:

实现

//Strategy.h

//Strategy.h

class Strategy
{
public:
virtual void PrimitiveOperation() = 0;
virtual ~Strategy();
protected:
Strategy();
}; class ConcreteStrategy1 :public Strategy
{
public:
ConcreteStrategy1();
~ConcreteStrategy1();
void PrimitiveOperation();
};
class ConcreteStrategy2 :public Strategy
{
public:
ConcreteStrategy2();
~ConcreteStrategy2();
void PrimitiveOperation();
};

//Strategy.cpp

//Strategy.cpp

#include"Strategy.h"
#include<iostream>
using namespace::std; Strategy::Strategy()
{}
Strategy::~Strategy()
{} ConcreteStrategy1::ConcreteStrategy1()
{}
ConcreteStrategy1::~ConcreteStrategy1()
{}
void ConcreteStrategy1::PrimitiveOperation()
{
cout << "ConcreteStrategy1 PrimitiveOperation()" << endl;
} ConcreteStrategy2::ConcreteStrategy2()
{}
ConcreteStrategy2::~ConcreteStrategy2()
{}
void ConcreteStrategy2::PrimitiveOperation()
{
cout << "ConcreteStrategy2 PrimitiveOperation()" << endl;
}

//Context.h

//Context.h

#ifndef _CONTEXT_H_
#define _CONTEXT_H_ class Strategy; class Context
{
public:
Context(Strategy*);
~Context();
void DoAction(); private:
Strategy* _strategy;
}; #endif

//Context.cpp

//Context.cpp

#include"Context.h"
#include"Strategy.h" Context::Context(Strategy* strategy)
{
_strategy = strategy;
}
Context::~Context()
{
delete _strategy;
}
void Context::DoAction()
{
_strategy->PrimitiveOperation();
}

//main.cpp

//main.cpp

#include"Context.h"
#include"Strategy.h" int main()
{
Strategy* p1 = new ConcreteStrategy1();
Strategy* p2 = new ConcreteStrategy2();
Context* c1 = new Context(p1);
Context* c2 = new Context(p2);
c1->DoAction();
c2->DoAction();
return 0;
}

能够看出Template是通过继承来实现接口,儿Strategy模式是通过组合来实现。这两种方式各有优缺点。

继承:长处是易于扩展和改动那些被复用的实现。

缺点有1)破坏了封装,继承父类的实现细节暴露给子类了。2)“白盒”复用,由于1)。3)父类实现更改时,全部子类不得不随之改变。

4)从父类继承而来的实如今执行期间不能改变(编译期间已经确定了。

组合:长处1)“黑盒”复用,封装性好。2)实现和抽象的依赖性低,由于组合对象和被组合对象之间的依赖性非常小。3)能够在执行期间改动,比如通过更改指针指向的对象。

缺点就是系统对象过多。

Strategy模式的更多相关文章

  1. 敏捷软件开发(4)--- TEMPLATE METHOD & STRATEGY 模式

    1.TEMPLATE METHOD 泛型,也就是这个模式,是可以基于泛型的. 我们往往会有一些算法,比如排序算法.它的算法部分,我可以把它放在一个基类里面,这样具体类型的比较可以放在子类里面. 看如下 ...

  2. 模板模式与策略模式/template模式与strategy模式/行为型模式

    模板模式 模版模式,又被称为模版方法模式,它可以将工作流程进行封装,并且对外提供了个性化的控制,但主流程外界不能修改,也就是说,模版方法模式中,将工作的主体架构规定好,具体类可以根据自己的需要,各自去 ...

  3. Template Method模式和Strategy模式[继承与委托]

    继承 program by difference. 通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code. 过度使用继承的代价是巨大的.应使用组合或者委托来替代继承. Tem ...

  4. Strategy 模式

    可以看到 Strategy 模式和 Template 模式解决了类似的问题,也正如在 Template 模式中分析的,Strategy模式和 Template 模式实际是实现一个抽象接口的两种方式:继 ...

  5. 【行为型】Strategy模式

    策略模式意图将解决问题的算法分别封装成一个个对象的形式,并使这些算法对象相互间可被替换.模式比较简单,对于策略对象结构的设计,可抽象一个抽象基类,并定义好相关算法(纯)虚接口,并由各种具体的实现算法子 ...

  6. C++设计模式---Strategy模式

    一.前言 学习的第一个设计模式!不知道理解的对不对,期望大家一起多交流~ Strategy模式:策略模式,定义了算法族,分别封装起来,此模式可以让算法的变化独立于使用算法的客户.Strategy模式将 ...

  7. 设计模式之Singleton模式和Strategy模式是什么

    Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...

  8. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  9. 设计模式之——浅谈strategy模式(策略模式)

    strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...

  10. 策略(strategy)模式

    Head First一书中对于策略(strategy)模式的正式定义是:策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 为了介绍这个算法,书中讲了 ...

随机推荐

  1. POJ 3688 Cheat in the Game(博弈论)

    [题目链接] http://poj.org/problem?id=3688 [题目大意] 有俩人玩一个取石子的游戏,你是裁判. 游戏中有W块石头和N张卡片,卡片上分别写着数字Ai. 玩家随机抽走一张卡 ...

  2. 【并查集】bzoj1015 [JSOI2008]星球大战starwar

    倒着处理删点,就变成了加点,于是并查集. #include<cstdio> using namespace std; #define N 400001 int fa[N],kill[N], ...

  3. VS2017序列号|Visual Studio 2017 激活码 序列号

    企业版:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF 专业版:KBJFW-NXHK6-W4WJM-CRMQB-G3CDH

  4. jQuery--样式

    Jquery(一)——样式篇1.$(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码, 因为我们在执行代码的时候,可能会依赖页面的某一个元 ...

  5. SHAREPOINT 2013 + PROJECT 2013 资料网站

    1.http://technet.microsoft.com/zh-CN/sharepoint 2\ 博客圆专业讲解  http://www.cnblogs.com/jianyus/archive/2 ...

  6. [Android Traffic] 看无线电波如何影响网络操作]

    转载自: http://blog.csdn.net/kesenhoo/article/details/7391031 Optimizing Downloads for Efficient Networ ...

  7. 配置SSH单向无密码访问

    服务器架构:系统:CentOS 6.5 x64主控端A:192.168.0.150远端主机B:192.168.0.151 原理: 利用ssh key生成公钥.私钥,密钥相当于一把钥匙,而公钥就相当于一 ...

  8. 深入理解CommonJS!

    CommonJS 一开始大家都认为JS是辣鸡,没什么用,官方定义的API只能构建基于浏览器的应用程序,CommonJS就按耐不住了,CommonJS API定义很多普通应用程序(主要指非浏览器的应用) ...

  9. Laravel 5系列教程四:数据库和Eloquent

    免费视频教程地址https://laravist.com/series/laravel-5-basic 上一篇写了一些Laravel Blade的基本用法和给视图传递变量的几种方式, 这一节我们来说说 ...

  10. centos7安装ifconfig命令

    ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifc ...