软件设计模式 策略模式 Strategy Pattern

chvnetcom 2011-05-01

 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)   Context(应用场景):   1、需要使用ConcreteStrategy提供的算法。   

2、内部维护一个Strategy的实例。  

3、负责动态设置运行时Strategy具体的实现算法。  

4、负责跟Strategy之间的交互和数据传递。  

Strategy(抽象策略类):  

1、定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。  

ConcreteStrategy(具体策略类):

2、 实现了Strategy定义的接口,提供具体的算法实现。

应用场景:

1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior)

2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充)

3、 对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。

UML图示:

软件设计模式 策略模式 Strategy Pattern

策略模式的实现

–策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。

–策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。

–环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端

策略模式的编写步骤

–1.对策略对象定义一个公共接口。

–2.编写策略类,该类实现了上面的公共接口

–3.在使用策略对象的类中保存一个对策略对象的引用。

–4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值

•策略模式的缺点

–1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

–2.造成很多的策略类。

•解决方案–采用工厂方法

测试:演示两个数的加、减、乘、除运算

一:

建立一个策略的接口

package collection2;

public interface Strategy
{
public int calculate(int a,int b);
}

 二:

实现一组策略的方法类

package collection2;


public class AddStrategy implements Strategy
{

public int calculate(int a, int b)
{
return a + b;
}

}

package collection2;

public class SubtractStrategy implements Strategy
{
public int calculate(int a, int b)
{
return a - b;
}
}

package collection2;


public class MultiplyStrategy implements Strategy
{

public int calculate(int a, int b)
{
return a * b;
}

}

package collection2;

public class DivideStrategy implements Strategy
{

public int calculate(int a, int b)
{
return a / b;
}

}

 三:

定义一个策略对象类,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值

package collection2;


public class Environment
{
private Strategy strategy;


public Environment(Strategy strategy)
{
this.setStrategy(strategy);
}


public void setStrategy(Strategy strategy)
{
this.strategy = strategy;
}


public Strategy getStrategy()
{
return strategy;
}


public int calculate(int a, int b)
{
return strategy.calculate(a, b);
}

}

 四:

构建一个策略的客服端类,对我们上面定义的策略模式进行测试

package collection2;


public class Client
{
public static void main(String[] args)
{
AddStrategy addStrategy = new AddStrategy();
// 加法策略
Environment environment = new Environment(addStrategy);
System.out.println("加法策略" + environment.calculate(8, 2));

// 减法策略
SubtractStrategy subtractStrategy = new SubtractStrategy();
environment.setStrategy(subtractStrategy);
System.out.println("减法策略:" + environment.calculate(8, 2));

// 乘法策略
MultiplyStrategy multiplyStrategy = new MultiplyStrategy();
environment.setStrategy(multiplyStrategy);
System.out.println("乘法策略:" + environment.calculate(8, 2));

// 除法策略
DivideStrategy divideStrategy = new DivideStrategy();
environment.setStrategy(divideStrategy);
System.out.println("除法策略:" + environment.calculate(8, 2));

}
}

 测试结果:

加法策略10

减法策略:6

乘法策略:16

除法策略:4

相关推荐