策略(Strategy)模式

 

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

概要:
- Strategy
模式定义一个算法族,并把每一种可能的算法封装成一个类,这些算法可以在应用程序内部被动态替换。策略模式可以降低客户端与算法之间的耦合关系。
-
这些算法具有一个相同的抽象接口,具体的算法通过继承的子类实现。
一个应用程序需要动态切换算法的时候, Strategy 模式便变得非常有用。

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

Strategy
模式 UML 类图

 

 

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.haobalu.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值