`

设计模式之 Strategy - 策略模式

阅读更多

Strategy模式也叫策略模式,是由GoF提出的23种软件设计模式的一种。 Strategy模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换。


本文介绍设计模式中的(Strategy)模式的概念,用法,以及实际应用中怎么样使用Strategy模式进行开发。
Strategy模式的概念与应用场景
概要:
- Strategy模式定义一个算法族,并把每一种可能的算法封装成一个类,这些算法可以在应用程序内部被动态替换。策略模式可以降低客户端与算法之间的耦合关系。
- 这些算法具有一个相同的抽象接口,具体的算法通过继承的子类实现。
一个应用程序需要动态切换算法的时候,Strategy模式便变得非常有用。

Strategy模式的应用场景一般是:
- 具有多种可能需要实现的算法
- 需要在程序中对算法进行动态切换

Strategy模式UML类图

Strategy模式的角色:
Strategy
    策略(算法)抽象。
ConcreteStrategy
    各种策略(算法)的具体实现。
Context
    策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。


Strategy模式的应用范例
为了帮助理解,我们举例来说明。
我们的程序要实现加密功能。加密有一个加密算法,加密算法有很多种,比如MD5,DES等,我们的程序需要实现这个功能,就是可以让用户选择不同的加密算法进行加密。
这个过程我们可以用Strategy模式来实现。

文件一览:
Client
    测试类。
EncryptStrategy
    相当于Strategy角色。加密算法的抽象类/接口。
DesStrategy
    相当于ConcreteStrategy角色。Des加密算法。
MD5Strategy
    相当于ConcreteStrategy角色。MD5加密算法。
EncryptContext
    相当于Context角色。

代码:

package zieckey.designpatterns.study.strategy;

/**
 *
 * 客户端测试程序。
 * @author zieckey
 *
 */

public class Client
{
    public static void main( String[] argv )
    {
        //2种不同的策略

    
     //使用DES策略(算法)

     EncryptContext context = new EncryptContext(new DesStrategy());
     context.encrypt();
    
     //使用MD5策略(算法)

     context = new EncryptContext(new MD5Strategy());
     context.encrypt();
    }
}


package zieckey.designpatterns.study.strategy;

/**
 *
 * Context
 *
 * 给客户端调用的
 *
 * @author zieckey
 * @since 2008/06/21
 */

public class EncryptContext
{
    IEncryptStrategy    strategy;

    public EncryptContext( IEncryptStrategy strategy )
    {
        this.strategy = strategy;
    }
    
    //执行具体的策略行为

    public void encrypt()
    {
        strategy.encrypt();
    }
}






package zieckey.designpatterns.study.strategy;

/**
 *
 * 加密算法接口。
 * 所有的加密算法都必须实现该接口。
 * 如果新增一个加密算法,那么只需要实现该接口,而现有的程序代码都不用改变。
 *
 * @author zieckey
 * @since 2008/06/21
 */

public interface IEncryptStrategy
{
    public void encrypt();//加密算法

}






package zieckey.designpatterns.study.strategy;

/**
 * 具体的加密算法
 * @author zieckey
 *
 */

public class MD5Strategy implements IEncryptStrategy
{
    public void encrypt()
    {
        System.out.println( "encrypt by MD5 algorithm." );
        //TODO MD5 algorithm HERE。这里我们没给出具体的算法。

    }
}





package zieckey.designpatterns.study.strategy;

/**
 * 具体的加密算法
 * @author zieckey
 *
 */

public class DesStrategy implements IEncryptStrategy
{
    public void encrypt()
    {
        System.out.println( "encrypt by DES algorithm." );
        //TODO DES algorithm HERE。这里我们没给出具体的算法。

    }
}


测试输出:

encrypt by DES algorithm.
encrypt by MD5 algorithm.


参考:
http://www.lifevv.com/sysdesign/doc/20071203214955037.html
http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html
分享到:
评论

相关推荐

    设计模式系列博客--策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来改变算法的情况。策略模式就是为了解决这类问题而诞生的,它允许我们在不修改对象本身的情况下...

    设计模式---策略者模式

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

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 - 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - 访问者模式...

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

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常用于替换硬编码的条件语句,使代码更加灵活、可扩展和易于维护。下面我们将详细探讨策略模式的核心概念、实现方式以及在实际...

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

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式允许你使用算法族,而无需在代码中硬编码这些算法。通过将算法封装到具有共同接口的独立对象中,策略模式使得你可以根据需要灵活地切换算法,...

    《设计模式18》-策略模式.ppt

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在《设计模式18》-策略模式.ppt中,这个模式被详细地讲解,包括其定义、意图、适用性、结构、效果以及如何使用。 策略模式的核心思想是将算法族封装...

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

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,有时我们需要根据不同的场景或条件选择不同的算法或行为。策略模式允许我们将这些算法封装成独立的类,每个类代表一种策略,然后在运行...

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

    首先,策略模式由三个主要组成部分构成:上下文(Context)、策略(Strategy)接口和具体策略(Concrete Strategy)。上下文是使用策略的对象,它维护一个对策略的引用,并调用策略的接口来执行算法。策略接口定义了一组...

    设计模式系列源码---策略模式

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

    JAVA设计模式例程-策略模式

    在众多的设计模式中,策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在这个“JAVA设计模式例程-策略模式”的压缩包中,我们可以深入探讨策略模式的原理及其应用。 策略模式的...

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

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

    HeadFirst 设计模式学习笔记1--策略模式Demo

    《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...

    java设计模式---诙谐易懂版

    1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以互换。策略模式让算法的变化独立于使用算法的客户端。在提供...

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

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

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

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式通常通过定义一系列算法类并让它们之间可以互换来实现。这些算法类都实现了一个公共接口,使得它们可以被相同的客户端代码调用,而...

    android应用开发设计模式之-策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java编程语言中,尤其是在Android平台上,这种模式能够使我们的代码更加灵活、可扩展且易于维护。 策略模式的核心思想是定义一系列算法,并将每个...

    设计模式-策略者

    "策略者"(Strategy)设计模式是其中的一种行为模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。这种模式让算法的变化独立于使用算法的客户。 在《设计模式-策略者》这篇文章中,作者深入浅...

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

    在这个"php设计模式-策略模式-例题学习"的例子中,我们将深入理解策略模式的运用及其在PHP中的实现。 首先,让我们来看看核心的类和接口: 1. `HandStrategyInterface.php`: 这个文件定义了一个接口`...

    设计模式--策略模式StrategyPattern

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

Global site tag (gtag.js) - Google Analytics