对象可能经常需要使用多不同的算发,但是如果变化频繁,会将类型变得脆弱...
1、动机
在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦合,从而避免上述问题?
2、意图
定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。该模式使得算法可独立于使用它的客户而变化。
3、图
4、代码
enum CartType
{
A,
B,
C
}
class Cart
{
public void GetAlignment( CartType carType )
{
if( cartType == CartType.A )
{
ProcessA();
}
else if ( cartType == CartType.B )
{
ProcessB();
}
else if ( cartType == CartType.C )
{
ProcessC();
}
}
protected virtual void ProcessA()
{
//...
}
protected virtual void ProcessB()
{
//...
}
protected virtual void ProcessC()
{
//...
}
}
---------------------------------------------------------------------
public interface IProcessStrategy //表达算法抽象
{
void Process();
}
public class ProcessStrategyA : IProcessStrategy
{
void Process(){};
}
public class ProcessStrategyB : IProcessStrategy
{
void Process(){};
}
public class ProcessStrategyC : IProcessStrategy
{
void Process(){};
}
class Cart
{
IProcessStrategy processStrategy;//对象组合(间接)
public Cart( IProcessStrategy processStrategy )
{
this.processStrategy = processStrategy;
}
public void SomeMethod1( )
{
processStrategy.Process();
}
public void SomeMethod2( )
{
processStrategy.Process();
}
public void SomeMethod3( )
{
processStrategy.Process();
}
}
class App
{
public static void Main()
{
Cart cart = new Cart( new ProcessStrategyC() );
}
}
------------------------------------------------------------------------
public class Point
{
int x ;
int y;
public Point( int x , int y )
{
this.x = x;
this.y = y;
}
}
public class PointComparer1 : IComparer
{
int Compare( object objA , object objB )
{
}
}
public class PointComparer2 : IComparer
{
int Compare( object objA , object objB )
{
}
}
class App
{
public static void Main()
{
ArrayList list = new ArrayList();
list.Add( new Point( 100 , 200 ) );
list.Add( new Point( 60, 80) );
list.Add( new Point( 32, 32) );
list.Add( new Point( 44, 44) );
list.Add( new Point( 55, 60) );
list.Sort( new PointComparer1() );
}
}
5、要点
(1) Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法、支持算法的变化。
(2) Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
(3) 与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。