设计模式 笔记 策略模式 Strategy

//---------------------------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, int breaks[])=0;

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 =
new Composition(new ArrayCompositor(100));

时间: 2024-10-11 06:44:31

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

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)

如何让孩子爱上设计模式 --14.策略模式(Strategy Pattern) 描述性文字 本节讲解的是行为型设计模式中的第一个模式: 策略模式, 这个模式非常简单,也很好理解. 定义一系列的算法,把每个算法封装起来,并使得他们可以相互替换, 让算法独立于使用它的客户而变化. 一般用来替换if-else,个人感觉是面向过程与面向对象思想的 过渡,这里举个简易计算器的栗子,帮助理解~ 普通的if-else/switch计算器 普通的面向过程if-else简易计算器代码如下: 运行结果如下: 这里我

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来

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

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 介绍 什么是策略模式(Strategy Pattern) 在软件开发过程中常常遇到这样的情况, 实现某一个功能有很多种算法或实现策略, 我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能. 如果将这些算法或者策略抽象

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

策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. MessageModel using System; using System.Collections.Generic; using System.Text; na

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

一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并且可以在运行时刻自由切换.工厂模式重点是用来创建对象. 策略模式应用比较广泛,比如:我们现在要定义数据交换格式,现有三种方案可选1,XML  2,JSON  3,CSV就可以使用策略模式实现. 这里我要强调的是------我们是针对不同数据源选择不同方案,针对的都是同一事物做相同意图的操作只是方案不

学习笔记——策略模式Strategy

策略模式,与模板模式一样,都是为了将接口和算法实现解耦,但策略模式更主要是整体算法的替换,而模板模式主要是流程一致,部分算法的替换. 个人理解为,一般算法替换,使用策略模式,当算法流程一致,可以提取为模板模式.实际中,策略模式,使用组合方式,将算法实现脱离上下文,上下文可以依据需要,使用不同的算法实现子类,效果比继承更好.

【设计模式】—— 策略模式Strategy

前言:[模式总览]——————————by xingoo 模式意图 定义一系列的算法,把他们封装起来,使得算法独立于适用对象. 比如,一个系统有很多的排序算法,但是使用哪个排序算法是客户对象的自有.因此把每一个排序当做一个策略对象,客户调用哪个对象,就使用对应的策略方法. 应用场景 1 当许多的类,仅仅是行为或者策略不同时,可以把行为或策略单独提取出来,这样主体的类就可以进行统一了. 2 需要使用不同的算法. 3 一个类定义了多种行为. 模式结构 Context 环境角色的,策略的调用者 cla

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法