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