2008-08-07

一:strategy模式(策略模式)

关键字: 策略模式 strategy

策略模式

策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端

 

策略模式由三部分组成:

a:  抽象策略角色:策略类,通常由一个接口或者抽象类实现
b:  具体策略角色:包装了相关的算法和行为
c:  环境角色:持有一个策略类的引用,最终给客户端调用的。

 

一个简单运用策略模式的例子:

public interface IStrategy {
	/**
	 * 抽象策略角色   策略类,通常由一个接口或者抽象类实现 
	 * @param a
	 * @param b
	 * @return
	 */
	public String calculate(float a,float b);

}

   

public class AddStrategy implements IStrategy {

	/**
	 * 具体策略角色:包装了相关的算法和行为
	 */
	@Override
	public String calculate(float a, float b) {
		// TODO Auto-generated method stub
		float result=a+b;
		return "相加结果为:" + result; 
	}

}

   

public class SubStrategy implements IStrategy {

	/**
	 * 具体策略角色:包装了相关的算法和行为
	 */
	@Override
	public String calculate(float a, float b) {
		// TODO Auto-generated method stub
		float result=a-b;
		return "相减结果为:" + result; 
	}

}

  

public class ContextRole {
	/**
	 * 环境角色,持有一个策略类的引用,最终给客户端调用的
	 */
	private IStrategy iStrategy;
	public ContextRole(IStrategy iStrategy){
		this.iStrategy=iStrategy;
	}
	public String calculate(float a,float b) {   
		return this.iStrategy.calculate(a, b);
	}
}

   

public class Test {
	/**
	 * Client
	 * @param args
	 */
	public static void main(String[] args) {
		IStrategy iStrategy=new AddStrategy();
		ContextRole contextRole=new ContextRole(iStrategy);
		String result=contextRole.calculate(300, 200);
		System.out.println(result);
		
		iStrategy=new SubStrategy();
	    contextRole=new ContextRole(iStrategy);
		result=contextRole.calculate(300, 200);
		System.out.println(result);
	}
}

   

相加结果为:500.0
相减结果为:100.0

 

评论
发表评论

您还没有登录,请登录后发表评论

小牛犊
搜索本博客
最近加入圈子
存档
最新评论