设计模式-策略模式

策略模式:定义一系列方法,把他们一个个封装起来,并且是他们可相互装换。

策略模式把针对一个算法标识的一系列具体算法分别封装在不同的类中,使得各个类给出的具体算法可以相互替换。

 

策略模式结构的三种角色:

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);
		
	}

}

 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值