//---------------------------15/04/28----------------------------

//Strategy 策略模式----对象行为型模式

/*

1:意图:

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。使算法可独立于使用它的客户而变化。

2:别名:

政策(Policy)

3:动机:

4:适用性:

1>许多相关的类仅仅是行为有异。策略提供了一种用多个行为中的一个行为来配置一个类的方法。

2>需要使用一个算法的不同变体。

3>算法使用客户不应该知道的数据。使用策略模式可以避免暴露复杂的与算法相关的数据结构。

4>一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。

将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

5:结构:

Context:

strategy--------------------------->Strategy:

ContextInterface()                  AlgorithmInterface()

|

---------------------

|                   |

ConcteStrategyA:        ConcreteStrategyB:

AlgorithmInterface()    AlgorithmInterface()

6:参与者:

1>Strategy

定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。

2>ConcreteStrategy:

根据Strategy定义的接口实现具体算法

3>Context

1)用一个ConcreteStrategy对象来配置。

2)维护一个对Strategy对象的引用。

3)可定义一个接口来让Strategy访问它的数据。

7:协作:

1>Strategy和Context相互作用以实现选定的算法,当算法被调用时,Context可以将该算法所需要的所有

数据都传递给该Strategy。或者使用自身来当作参数传给Strategy。

2>Context将它的客户的请求转发给它的Strategy。客户通常创建并传递一个ConcreteStrategy对象给

Context;这样客户可以仅与Context交互。

8:效果:

1>相关算法系列:

Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法的公共功能

2>一个替代继承的方法:

如果使用继承来实现不同的算法,会导致Context难以理解,难以维护和难以扩展,并且算法和实现耦合很

深,所以Strategy模式很好的补足了这些部分。

3>消除了一些条件语句:

4>实现的选择:

Strategy可以提供相同行为的不同实现,客户可以根据不同时间/空间权衡取舍要求,从而选区不同的策略。

5>客户必须了解不同的Strategy:

这是Strategy模式潜在的一个缺点,客户必须熟知Strategy的实现才能正确选择什么Strategy。

6>Strategy和Context的通信开销:

一些简单的Strategy可能不需要参数,但是为了别的Strategy考虑,Context和Strategy之间

通信的接口必须要“通用”,也就是考虑到所有的参数,所以这可能造成浪费。

7>增加了对象的数目:

Strategy增加了应用中的对象的数目。可采用Flyweight来减少开销。

9:实现:

1>定义Strategy和Context接口:

1)传递一些数据:

Context可能会发送一些Strategy不需要的数据。这个方法通过加大开销来解耦两个类

2)传递自己,或在Strategy中存放一个Context的引用:

这样Strategy和Context会更紧密地耦合在一起。

2>将Strategy作为模版参数:

这样必须满足两点:

1)可以在编译时选择Strategy

2)不需要在运行时改变

这就是属于编译器多态。

3>使Strategy对象称为可选的:

如果即使不使用Strategy对象Context还是有意义的话,可以简化Context,让Context在访问Strategy

前检查是否存在,有就使用,没有就执行缺省的行为。

10:代码示例:                                                                        */

//Context:
里面保存了一个Compositior类的指针,也就是一个ConcreteStrategy

class Composition

{

public:

Composition(Compositior*);

void Repair();

private:

Compositior* _compositor;

Component* _components;

int _componentCount;

int _lineWidth;

int* _lineBreaks;

int _lineCount;

};

//Abstract Strategy

class Compositor

{

public:

virtual int Compose(Coord natural[],Coord stretch[], Coord shrink[],

int componentCount,
int lineWidth, ;

protected:

compositor();

};

//这里使用到了Strategy的操作,Compose()

void Composition::Repair()

{

Coord* natural;

Coord* stretchability;

Coord* shrinkability;

int componentCount;

int* breaks;

int breakCount;

breakCount = _compositor->Compose(natural, stretchability, shrinkability

componentCount, _lineWidth, breaks);

}

//ConcreteStrategy:自己实现自己的Compose具体怎么做

class SimpleCompositor : Compositor

{

public:

SimpleCompositor();

virtual int Compose(Coord natural[],Coord stretch[], Coord shrink[],

int componentCount,
int lineWidth, int breaks[]);

};

class TexCompositor : Compositor

{

TexCompositor();

virtual int Compose(Coord natural[],Coord stretch[], Coord shrink[],

int componentCount,
int lineWidth, int breaks[]);

};

class ArrayCompositor : Compositor

{

ArrayCompositor(int interval);

virtual int Compose(Coord natural[],Coord stretch[], Coord shrink[],

int componentCount,
int lineWidth, int breaks[]);

};

//简单的使用,但是每次都要new一个Strategy对象,可以使用Flyweight模式优化

Composition* quick =
new Composition(new SimpleCompositor);

Composition* slick =
new Composition(new TexCompositor);

Composition* iconic =
));


设计模式 笔记 策略模式 Strategy的更多相关文章

  1. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  2. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  3. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  4. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  5. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  6. [设计模式] 21 策略模式 Strategy

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...

  7. 大熊君说说JS与设计模式之------策略模式Strategy

    一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...

  8. 设计模式之策略模式Strategy

    /** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为. * 问题:设计一个鸭子模拟游戏. * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢) ...

  9. 大话设计模式之策略模式(strategy)

    策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响使用算法的用户. 针对商城收银模式,打折,返现促销等的例子: 打折还是促销其实都是一些算法,可以用工厂模式来 ...

随机推荐

  1. TSQL使用ADHOC访问Excle文件

    如题,今天正好碰到这个问题,现将相关知识点记录如下: --开启高级配置功能 reconfigure --开启导入功能 reconfigure --允许在进程中使用ACE.OLEDB.12 --允许使用 ...

  2. 入坑Vue

    长期的后端数据开发着实有些枯燥无趣,项目完工,闲暇之际,最近一直在研究前端方面的东西,不得感叹,前端技术发展速度快的让人有些目不暇接,从jQuery开启的插件化时代,几乎许多网站都被jQuery支配, ...

  3. MyBatis 中的级联

    MyBatis 的级联分为 3 种. 1.鉴别器(discriminator):它是根据某些条件决定采用具体实现类级联的方案,比如体检表要根据性别去区分. 2.一对一(association):比如学 ...

  4. cJSON 使用详解

    由于c语言中,没有直接的字典,字符串数组等数据结构,所以要借助结构体定义,处理json.如果有对应的数据结构就方便一些, 如python中用json.loads(json)就把json字符串转变为内建 ...

  5. 启动 uiautomatorviewer 时报 SWT folder '..\lib\location of your Java installation.' does not exist.

    现象,之前本机上的 uiautomatorviewer 一直是好的,最近这段时间无故就不行了,报如标题错误,网上找了各种办法仍无法有效解决,静心细想上一次使用该工具时到目前对本机有做什么跟系统或者工具 ...

  6. webstorm 2017 激活

    参考:https://blog.csdn.net/wangyingwing/article/details/79119592

  7. JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  8. div宽度随屏幕大小变化

    题目: 一个页面上两个div左右铺满整个浏览器, 要保证左边的div一直为100px,右边的div跟随浏览器大小变化, 比如浏览器为500,右边div为400,浏览器为900,右边div为800. 方 ...

  9. Docker技术入门与实战 第二版-学习笔记-6-仓库

    仓库(Repository)是集中存放镜像的地方 一个容易混淆的概念是注册服务器(Registry). 实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像. ...

  10. Jmeter核心-hc课堂笔记

    自动化测试平台-Httprunner-接口.UI.协议. 平台语言-JAVA-UI-Selenium(java版的).Appium(java版的).接口-Httpclient.Jmeter.(Jmet ...