Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4206904
  • 博文数量: 176
  • 博客积分: 10059
  • 博客等级: 上将
  • 技术积分: 4681
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-24 12:27
文章分类

全部博文(176)

文章存档

2012年(1)

2011年(4)

2010年(14)

2009年(71)

2008年(103)

分类: 项目管理

2008-06-21 12:39:42

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.cnblogs.com/justinw/archive/2007/02/06/641414.html
阅读(2870) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~