小A:“策略模式应该怎么去应用它?”
大B:“1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。2、如果系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法类的子类。3、一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复发的和只与算法有关的数据。”
使用案例:
AWT中的LayoutManager,Swing中的Border。
代码例子
1、抽象策略
package com。eekq。strategy;
public interface IStrategy{
/**策略方法*/
public abstract double add();
}
2、具体策略,这里我以两个具体策略为例
package com。eekq。strategy;
public class ConcreteStrategy1 implements IStrategy{
/**示意性算法*/
public double add(){
//TODO自动生成方法存根
System。out。println(this。getClass()。getName() “的加法运算”);
return0;
}
}
package com。eekq。strategy;
public class ConcreteStrategy2 implements IStrategy{
public double add(){
//TODO自动生成方法存根
System。out。println(this。getClass()。getName() “的加法运算”);
return 0;
}
}
3、环境角色
package com。eekq。strategy;
public class Context{
/**环境角色类*/
private IStrategy strategy;
public Context(IStrategy strategy){
this。strategy=strategy;
}
/**策略方法*/
public double add(){
this。strategy。add();
return 0;
}
}
4、客户端调用
package com。eekq。strategy;
public class Main{
/ *@paramargs
*/
public static void main(String[]args){
//TODO 自动生成方法存根
Context context=new Context(new ConcreteStrategy1());
context。add();//执行算法。
context=new Context(new ConcreteStrategy2());
context。add();//执行算法。
}
}
5、执行结果:
com。eekq。strategy。ConcreteStrategy1的加法运算
com。eekq。strategy。ConcreteStrategy2的加法运算