可以看到 Strategy 模式和 Template 模式解决了类似的问题,也正如在 Template 模式中
分析的,Strategy模式和 Template 模式实际是实现一个抽象接口的两种方式:继承和组合之
间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体
的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象
中,将抽象接口放在组合类中。这两种方式各有优缺点,先列出来:
 继承:
„ 优点
1)易于修改和扩展那些被复用的实现。
„ 缺点
1)破坏了封装性,继承中父类的实现细节暴露给子类了;
2) “白盒”复用,原因在 1)中;
3)当父类的实现更改时,其所有子类将不得不随之改变
4)从父类继承而来的实现在运行期间不能改变(编译期间就已经确定了)

 组合 :
„ 优点
1) “黑盒”复用,因为被包含对象的内部细节对外是不可见的;
2)封装性好,原因为 1) ;
3)实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小) ;
4)可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象
基类的指针) 。
„缺点
1)系统中对象过多。

从上面对比中我们可以看出,组合相比继承可以取得更好的效果,因此在面向对象
的设计中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(Favor Composition Over Inheritance)

 //////////////Strategy.h//////////////////////
#pragma once
class Strategy
{
public:
virtual ~Strategy();
Strategy();
virtual void AlgrithmInterface() = ;
protected:
private:
}; class ConcreteStrategyA : public Strategy
{
public:
~ConcreteStrategyA();
ConcreteStrategyA();
void AlgrithmInterface();
protected:
private:
}; class ConcreteStrategyB : public Strategy
{
public:
~ConcreteStrategyB();
ConcreteStrategyB();
void AlgrithmInterface();
protected:
private:
};
/////////////Strategy.cpp/////////////////////////////////////////////////
#include "Strategy.h"
#include <iostream>
using namespace std;
Strategy::~Strategy()
{
cout<<"~Strategy....."<<endl;
}
Strategy::Strategy()
{ } ConcreteStrategyA::~ConcreteStrategyA()
{
cout<<"~ConcreteStrategyA....."<<endl;
}
ConcreteStrategyA::ConcreteStrategyA()
{ }
void ConcreteStrategyA::AlgrithmInterface()
{
cout<<"test ConcreteStrategyA....."<<endl;
} ConcreteStrategyB::~ConcreteStrategyB()
{
cout<<"~ConcreteStrategyB....."<<endl;
}
ConcreteStrategyB::ConcreteStrategyB()
{ }
void ConcreteStrategyB::AlgrithmInterface()
{
cout<<"test ConcreteStrategyB....."<<endl;
}
///////////Context.h///////////////////////////
#pragma once
class Strategy ;
class Context
{
public:
~Context();
Context(Strategy* stg);
void DoAction();
protected:
private:
Strategy* _stg ;
};
//////////Context.cpp///////////////////////////////////
#include "Context.h"
#include "Strategy.h"
#include <iostream> Context::Context(Strategy* stg)
{
_stg = stg ;
} Context::~Context()
{
if (_stg != NULL)
{
delete _stg ;
}
} void Context::DoAction()
{
_stg->AlgrithmInterface();
}
/////////////main.cpp//////////////////////////////////
#include "Context.h"
#include "Strategy.h"
#include <iostream>
int main()
{
Strategy* ps = new ConcreteStrategyA();
Context* pc = new Context(ps);
pc->DoAction();
delete pc;
getchar();
return ;
}

Strategy 模式的更多相关文章

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

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

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

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

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

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

  4. 【行为型】Strategy模式

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

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

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

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

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

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

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

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

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

  9. 策略(strategy)模式

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

随机推荐

  1. JavaScript高级程序设计61.pdf

    JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...

  2. Linux C 编译错误总结

    1. test.c:59:5: warning: incompatible implicit declaration of built-in function ‘memset’ [enabled by ...

  3. ARCGIS 点抽稀的实现

    点抽稀是制图综合的一部分,即在点数据点特别密集是,需要选取比较重要的点而舍去不要重的点,使得图面整洁. 一.基本原理 先把所有的点符号都设成透明.这样显示是没有点的.然后给这些点设置标注.标注方法很奇 ...

  4. JAVA基础英语单词表(下)

    quantity                     / 'kwɔntiti /                    量,数量 query                             ...

  5. myeclipse输入“.”后没有自动提示功能

    今天和室友安装了一样的myeclipse版本,结果室友的自动提示功能有,我的输入"."后却不能提示,这对我们敲代码简直来说是一个折磨,不能自动提示,本来还以为是系统问题,一个是wi ...

  6. Nginx平台构架 分类: Nginx 2015-07-13 10:55 205人阅读 评论(0) 收藏

    深入理解Nginx模块发开与架构解析读书笔记. nginx在启动后,在unix系统中会以daemon的方式(可以手动关闭 nginx.conf daemon off)在后台运行,后台进程包含一个mas ...

  7. 设计模式——单例模式 (C++实现)

    单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享.有很多地方需要这样的功能模块,如系统的日志输出,G ...

  8. 设计模式——工厂模式 (C++实现)

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累. ...

  9. Linux下搭建Oracle11g RAC(8)----创建ASM磁盘组

    以grid用户创建ASM磁盘组,创建的ASM磁盘组为下一步创建数据库提供存储. ① grid用户登录图形界面,执行asmca命令来创建磁盘组: ② 进入ASMCA配置界面后,单击Create,创建新的 ...

  10. CentOS7使用Redis

    使用Python操作Redis 安装pip # yum install python-pip 升级pip # pip install --upgrade pip 安装redis-py库 # pip i ...