您的位置:首页 > 其它

《设计模式精解》学习笔记(十)------Strategy(策略)模式

2006-12-22 15:39 309 查看
《设计模式精解》学习笔记(十)------Strategy(策略)模式

 

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

 

比如说在我们的系统中需要对一个图形或一个艺术字上色(这样的系统在现实中是有的,我呆的前一家公司做的一个票据输出系统就有这样的功能)。假如我们需要各种颜色的图形或艺术字,那么我们将每一种颜色的图形或艺术字分别实现一个是非常愚蠢的,因为需求是变化的。当我们实现了某个图形或艺术字后。应该对一些列颜色分别进行实现。这样我们就可以不用将颜色和图形邦定,而使代码僵化。

 

下面是事例代码:(这里举的事例比较简单只是用来说明问题)

 

先定义颜色抽象类

package Strategy;

 

public abstract class Color

{

       public abstract void printColor();

}//end class Color

 

分别实现两种颜色

package Strategy;

 

public class RedColor extends Color

{

       public void printColor()

       {

              System.out.println("Print the red color!");

       }//end printColor()

 

}//end class RedColor

 

package Strategy;

 

public class BlackColor extends Color {

 

       public void printColor()

       {

              System.out.println("Print the black color!");

       }//end printColor()

 

}//end class BlackColor

 

下面实现一个算法解决类供用户选择合适的算法

package Strategy;

 

public class ColorSolver

{

       private Color color;

      

       public ColorSolver(Color col)

       {

              this.color = col;

       }//end ColorSolver(...)

      

       public void printSingleColor()

       {

              color.printColor();

       }//end printSigleColor()

      

       public void printAllColor(Color col)

       {

              this.color = col;

       }

}//end class ColorSolver

 

最后让我们实现调用

package Strategy;

 

public class StrategyPattern

{

       private ColorSolver cs = new ColorSolver( new RedColor());

      

       public void print()//打印出颜色

       {

              cs.printSingleColor();

              cs = new ColorSolver( new BlackColor() );

              cs.printSingleColor();

       }//end print()

      

       public static void main(String[] args)

       {

              System.out.println("Strategy Pattern.../n");

             

              StrategyPattern sp = new StrategyPattern();

              sp.print();

       }//end main(...)

 

}//end StrategyPattern

 

运行结果如下

Strategy Pattern...

 

Print the red color!

Print the black color!

这样我们达到了运行期间可以随意切换算法的目的。

 

下面是UML图:



Strategy模式建立在几条原则的基础上:

l        对象拥有责任。用户的责任是知道用什么算法。

l        这些责任的不同特定实现通过使用多态来表现。

l        需要将几个不同的实现按照——概念上——相同的算法来管理。

l        一个好的设计经验:将问题领域中发生的行为彼此分离——也就是说,使他们解耦。这让我们可以改变对某一行为负责的类,而不会对其他行为产生不好的影响。

 

从某种角度来说,Strategy模式是关于算法封装的。但是,在实践中,我发现可以用它来封装几乎任何种类的规则。比如说本文中我举的关于Color的例子。

 

Strategy模式关键特征:

l        意图:让你可以使用不同的业务规则或算法——取决于它们出现的场景。

l        问题:需要根据发出请求的客户或被处理的数据对算法作出选择。如果你只是拥有一些不发生变化的算法,你就不需要Strategy模式。

l        解决方案:将算法的选择和算法的实现相分离。让客户可以基于场景作出选择。

l        效果:Strategy模式定义了一系列的算法;switch语句或条件语句得到了避免;你必须以相同的方式调用所有的算法,它们必须有相同的接口。

 

在我看来Strategy模式就是定义了一个抽象类然后派生出几个类通过向下转型得到不同对象的特有方法。再简单点也就是说是OO概念中多态的运用。(要不就是我理解错了,还请大家指教)

 

小结:

Strategy模式是一种定义算法家族的方法。从概念上来说,所有这些算法都作相同的工作。他们只是拥有不同的实现。

 

通过一个抽象类派生出执行算法的所有不同方式,主模块上不需要担心实际使用的是许多可能性中的哪一个。这让新的变化情况可以被添加进来。,但也产生了管理这些变化情况的需要。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=610786
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息