策略模式:定义一系列方法,把他们一个个封装起来,并且是他们可相互装换。
策略模式把针对一个算法标识的一系列具体算法分别封装在不同的类中,使得各个类给出的具体算法可以相互替换。
策略模式结构的三种角色:
1、策略(Strategy):是一个接口,定义若干算法标志,即定义若干个抽象方法。
2、具体策略(ConcreteStrategy):策略的实现类,给出算法标识的具体算法。
3、上下文(Context):·依赖于策略接口的类,即包含策略声明的变量。上下文提供一个方法,该方法委托策略变量调用具体策略的具体算法。
策略UML类图:
例子说明:
求平均值
A:简单的求平均值
B:除去最大最小数值,求平均值
/**
*
*/
package org.rico.pattern.demo.strategy;
/**
* @author rico 2013-3-11
* 策略接口
*/
public interface Strategy {
/**
* 策略规定算法标识
* @param a
* @return
*/
public abstract double computeScore(double[] a);
}
/**
*
*/
package org.rico.pattern.demo.strategy;
/**
* @author rico 2013-3-11
* 具体策略A
*/
public class StrategyA implements Strategy {
/* 实现策略规定算法标识-求平均值(non-Javadoc)
* @see org.rico.pattern.demo.strategy.Strategy#computeScore(double[])
*/
@Override
public double computeScore(double[] a) {
double ret = 0;
for(double num : a) {
ret = ret + num;
}
return ret/a.length;
}
}
/**
*
*/
package org.rico.pattern.demo.strategy;
import java.util.Arrays;
/**
* @author rico 2013-3-11
*
*/
public class StrategyB implements Strategy {
/* 实现策略规定算法标识-除去最大最小值求平均值(non-Javadoc)
* @see org.rico.pattern.demo.strategy.Strategy#computeScore(double[])
*/
@Override
public double computeScore(double[] a) {
Arrays.sort(a);
double ret = 0;
for(int i=1; i<a.length-1; i++) {
ret = ret + a[i];
}
return ret/(a.length-2);
}
}
/**
*
*/
package org.rico.pattern.demo.strategy;
/**
* @author rico 2013-3-11
* 上下文,包含策略声明变量
*/
public class GameContext {
private Strategy strategy = null;
public GameContext() {}
public GameContext(Strategy strategy) {
this.strategy = strategy;
}
/**
* 委托具体策略计算平均值
* @param a
*/
public double compute(double[] a) {
return strategy.computeScore(a);
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
/**
*
*/
package org.rico.pattern.demo.strategy;
/**
* @author rico 2013-3-11
*
*/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
double[] a = new double[] {3, 4, 1, 7, 9};
GameContext context = new GameContext();
Strategy strategy = new StrategyA();
context.setStrategy(strategy);
double val = context.compute(a);
System.out.println("######################StrategyA result : " + val);
strategy = new StrategyB();
context.setStrategy(strategy);
val = context.compute(a);
System.out.println("######################StrategyB result : " + val);
}
}