`

Strategy(策略)---对象行为型模式

阅读更多

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

 

当存在以下情况时使用Strategy模式:

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

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

3、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

 

Strategy和Context相互作用以实现选定的算法。当算法被调用时,Context可以将该算法所需要的所有数据都传递给该Strategy。或者,Context可以将自身作为一个参数传递给Strategy操作。这就让Strategy在需要时可以回调Context。

Context将它的客户的请求转发给它的Strategy。客户通常创建并传递一个ConcreteStrategy对象给该Context。这样,客户仅与Context交互。通常有一系列的ConcreteStrategy类可供客户从中选择。

 

Strategy模式有下面的优点和缺点:

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

2、继承提供了另一种支持多种算法或行为的方法。你可以直接诶生成一个Context类的子类,从而给它以不同的行为。但这会将行为硬行编制到Context中,而将算法的实现与Context的实现混合起来,从而使Context难以理解、难以维护和难以扩展,而且还不能动态地改变算法。最后你得到一堆相关的类,它们之间的唯一差别是它们所使用的算法或行为。将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。

3、Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。当不同的行为堆砌在一个类中时,很难避免使用条件语句来选择合适的行为。将行为封装在一个个独立的Strategy类中消除了这些条件语句。

含有许多条件语句的代码通常意味着需要使用Strategy模式。

4、Strategy模式可以提供相同行为的不同实现。客户可以根据不同时间、空间权衡取舍要求从不同策略中进行选择。

5、客户必须了解不同的Strategy。Strategy模式有一个潜在的缺点,就是一个客户要选择一个合适的Strategy就必须知道这些Strategy到底有何不同。此时,可能不得不向客户暴露具体的实现问题。

6、Strategy和Context之间的通信开销。无论各个ConcreteStrategy实现的算法是简单还是复杂,它们都共享Strategy定义的接口。因此很可能某些ConcreteStrategy不会都用到所有通过这个接口传递给它们的信息。简单的ConcreteStrategy可能不使用其中的任何信息。这就意味着有时Context会创建和初始化一些永远不会用到的参数。如果存在这样问题,那么将需要在Strategy和Context之间更尽兴紧密的耦合。

7、Strategy模式增加了一个应用中的对象的数目。有时你可以将Strategy实现为可供各Contxt共享的无状态的对象来减少这一开销。任何其余的状态都由Context维护。Context在每一次对Strategy对象的请求中都将这个状态传递过去。共享的Strategy不应在各次调用之间维护状态。Flyweight模式更详细地描述了这一方法。

 

考虑下面的实现问题:

1、定义Strategy和Context接口。Strategy和Context接口必须使得ConcreteStrategy能够有效地访问它所需要的Context中的任何数据,反之亦然。一种办法是让Context将数据放在参数中传递给Strategy操作。也就是说,将数据发送给Strategy。这使得Strategy和Context解耦。但另一方面,Context可能发送一些Strategy不需要的数据。

另一种办法是让Context将自身作为一个参数传递给Strategy,该Strategy再显式地向该Context请求数据。或者,Strategy可以存储对它的Context的一个引用,这样根本不再需要传递任何东西。这两种情况下,Strategy都可以请求到它所需要的数据。但现在Context必须对它的数据定义一个更为精细的接口,这将Strategy和Context更紧密地耦合在一起。

2、使Strategy对象成为可选的。如果即使在不使用额外的Strategy对象的情况下,Context也还有意义的话,那么它还可以被简化。Context在访问Strategy前先检查它是否存在,如果有,那么就使用它。如果没有,那么Context执行缺省的行为。这种方法的好处是客户根本不需要处理Strategy对象,除非它们不喜欢缺省的行为。

 

Flyweight模式:Strategy对象经常是很好的轻量级对象。

 

分享到:
评论

相关推荐

    (行为型模式) Strategy 策略模式

    C#面向对象设计模式 (行为型模式) Strategy 策略模式 视频讲座下载

    C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式

    上下文是使用策略的对象,它定义了客户所期望的接口,并负责调用具体策略对象的算法。策略是所有具体策略的抽象接口,它封装了一组相关的算法。而具体策略则是实现了策略接口的具体算法,它们之间可以相互替换,...

    c++设计模式-行为型模式-策略模式

    c++设计模式-行为型模式-策略模式;qt工程;c++简单源码; 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于...

    C#面向对象设计模式纵横谈\23 行为型模式Strategy策略模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第23节:行为型模式Strategy策略模式

    行为型——Strategy(策略模式)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并让它们之间可以互相...

    策略(strategy)模式

    这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据策略对象改变的上下文对象。策略对象改变上下文对象的执行算法。策略模式可以定义一系列的算法,并将每一个算法封装起来...

    设计模式-策略模式-c++版

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式主要用于封装一系列算法,并让它们之间可以互相替换,使得算法的变化独立于使用算法的客户。这种模式通常涉及三个主要角色:策略...

    设计模式-策略模式(Strategy)

    例如,可以使用工厂模式来创建策略对象,或者使用命令模式来封装策略的调用。 下面是一个简单的策略模式示例: ```java // 策略接口 public interface ShippingStrategy { double calculateShippingCost(double ...

    Java 设计模式-策略模式(Strategy)Android讲解

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式是通过定义一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户而变化。这种模式在Android开发中...

    走进设计模式之 策略模式(Strategy)

    4. **客户端代码(Client)**:客户端代码创建具体策略对象,并将其传递给上下文。例如,`main.cpp`可能是客户端代码: ```cpp int main() { Context context(new StrategyA()); context.executeStrategy(); ...

    php设计模式-策略模式-例题学习

    在PHP中,我们可以通过依赖注入或者工厂模式来创建和管理策略对象,以实现这种动态行为选择。 在实际应用中,策略模式常用于需要多种算法或行为,并且需要在运行时根据条件或需求进行切换的场景。例如,在游戏中,...

    [行为模式] head first 设计模式之策略模式(strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式允许我们将这些算法封装成独立的类,使得它们可以互换,从而提高...

    设计模式C++学习之策略模式(Strategy)

    `Context`持有一个`Strategy`指针,并通过`setStrategy`方法改变使用的策略,然后在`executeStrategy`中调用策略对象的`execute`方法执行相应的算法。 在`Demo1_Strategy`这个示例中,可能包含了多个C++源文件,...

    设计模式--策略模式java例子

    策略对象改变了一个类的行为,策略类定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 ### 二、策略模式的组成角色 1. **环境(Context)**:持有一个策略对象的引用...

    strategy策略模式源码

    这种类型的设计模式属于行为模式。 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略对象改变了一个类的执行算法。这种模式通常用于有多种算法可供选择的情况,根据不同的条件,可以...

    设计模式专题之(十六)策略模式---设计模式策略模式示例代码(python--c++)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择合适的...

    策略模式 Strategy Pattern

    ### 策略模式 Strategy Pattern ...以上代码展示了策略模式的基本实现方法,通过创建不同的策略对象并将其传递给上下文类,可以在运行时改变上下文的行为。这种灵活性非常适合需要在运行时动态选择算法的场景。

    strategy-pattern-in-unity

    3. **上下文类(Context)**:通常是一个Unity的脚本,如`CharacterController`,它持有一个策略对象,并通过调用策略对象的方法来执行行为。上下文类不关心具体的策略实现,只关注如何调用策略。 4. **策略选择与...

    23种 设计模式---面向对象的基本原则

    - 策略模式(Strategy):定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户。 - 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤...

    Python库 | django-strategy-field-1.1.1.tar.gz

    策略模式是一种行为设计模式,允许我们在运行时动态地改变对象的行为。在Django中,模型字段通常有固定的行为,例如验证、默认值处理等。`django-strategy-field`库通过此模式,使得我们可以根据不同的业务需求,为...

Global site tag (gtag.js) - Google Analytics