//---------------------------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. 获取本地机器的特征码IP MAC

    using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Ma ...

  2. 分布式事务实现-Percolator

    Google为了解决网页索引的增量处理,以及维护数据表和索引表的一致性问题,基于BigTable实现了一个支持分布式事务的存储系统.这里重点讨论这个系统的分布式事务实现,不讨论percolator中为 ...

  3. Oracle EBS 自治事务

    自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...

  4. Oracle EBS SLA取值

    -- 从GL总账追溯到 => 子分类账SLA => 子模块AP.AR等 SELECT xep.name, -- 法人主体 xep.legal_entity_identifier, -- 法 ...

  5. MPT树详解

    目录 MPT树定义 MPT树的作用是什么? 前缀树与默克尔树 前缀树 默克尔树 三种节点类型 MPT中的Merkle HP编码 官方表示形式 相关MPT树 参考目录 @ MPT树定义 一种经过改良的. ...

  6. 【Python】os.path.isfile()的使用方法汇总

    方法一: # -*- coding:utf-8 -*- import os import sys from uiautomator import device as d filepath = r'E: ...

  7. 【js】实现继承的6种方法

    1.原型链 基本思想:利用原型链让一个引用类型继承另一个引用类型的属性和方法. 让原型对象(B.prototype)等于另一个类型的实例(new A()), 即B.prototype = new A( ...

  8. 洛谷P1208

    #include <iostream>#include <algorithm>#include <cstdio>using namespace std; struc ...

  9. 【剑指offer】数值的整数次方

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/25506085 转载请注明出处:http:// ...

  10. FastJson遇见的问题或项目实战中优化的问题,看源码都可以解决

    1:感觉见鬼了一般存储JSONObject中的字段竟然不见了? JSONObject object=new JSONObject(); Map fields = new HashMap(); fiel ...