Robin's Blog

记录 积累 学习 成长

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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角色。

代码:
  1. public class Client {  
  2.     /** 
  3.      * Test Strategy Pattern 
  4.      *  
  5.      */  
  6.     public static void main(String[] args) {  
  7.         //2种不同的策略  
  8.           
  9.         //使用DES策略(算法)  
  10.         EncryptContext context = new EncryptContext(new DesStrategy());  
  11.         context.encrypt();  
  12.           
  13.         //使用MD5策略(算法)  
  14.         context = new EncryptContext(new MD5Strategy());  
  15.         context.encrypt();  
  16.           
  17.     }  
  18. }  
  19.   
  20. /** 
  21.  * Strategy & subclass 
  22.  * 
  23.  */  
  24. interface EncryptStrategy {  
  25.     public void encrypt();  
  26. }  
  27.   
  28. //Strategy'subclass  
  29. class DesStrategy implements EncryptStrategy {  
  30.     public void encrypt() {  
  31.         System.out.println("encrypt by DES algorithm.");  
  32.         //TODO DES algorithm HERE。这里我们没给出具体的算法。  
  33.     }  
  34. }  
  35.   
  36. //Strategy'subclass  
  37. class MD5Strategy implements EncryptStrategy {  
  38.     public void encrypt() {  
  39.         System.out.println("encrypt by MD5 algorithm.");  
  40.         //TODO MD5 algorithm HERE。这里我们没给出具体的算法。  
  41.     }  
  42. }  
  43.   
  44. /** 
  45.  * Context 
  46.  * 
  47.  */  
  48. class EncryptContext {  
  49.     //策略对象  
  50.     EncryptStrategy strategy;  
  51.          
  52.     public EncryptContext(EncryptStrategy strategy) {  
  53.         this.strategy = strategy;  
  54.     }  
  55.       
  56.     //执行具体的策略行为  
  57.     public void encrypt() {  
  58.         strategy.encrypt();  
  59.     }  
  60.       
  61. }  



执行Client,输出结果:
C:\Strategy>javac *.java
C:\Strategy>java Client
encrypt by DES algorithm.
encrypt by MD5 algorithm.
C:\Strategy>
我们可以发现,Client里可以动态的切换加密的算法。

Strategy模式与State,Bridge,Template Method等模式的区别
Strategy模式与State模式的结构形式几乎完全一样。但它们的应用场景(目的)却不一样,State模式重在强调对象内部状态的变化改变对象的 行为,Strategy模式重在外部对策略的选择,策略的选择由外部条件决定,也就是说算法的动态的切换。但由于它们的结构是如此的相似,我们可以认为“ 状态模式是完全封装且自修改的策略模式”。
设计模式之State - 状态模式

Strategy模式与Bridge模式在结构上存在几分相似。但单从结构上讲,Bridge模式中,存在行为和抽象的两条平行的继承类;但Strategy模式中只有具有继承关系的算法类。它们在应用场景上的区别,大家可以通过上面的文章加以比较,这里不再详述。
设计模式之Bridge - 桥接模式

Strategy 模式与Template Method模式都是对不同算法的抽象与封装,但它们的实现粒度不一样。Strategy模式从类的角度,对整个算法加以封装,Template Method模式从方法的角度,对算法的一部分加以封装,且Template Method模式有一个方法模板的概念,在作为抽象类的父类里,定义了一个具有固定算法并可以细分为多个步骤的模板方法(public)。
设计模式之Template Method - 模板方法模式
posted on 2009-08-25 17:38  Robin99  阅读(463)  评论(0编辑  收藏  举报