策略模式即解决问题的策略。当我们需要解决某个问题时,可能会有多种解决问题的办法,这时候,可以将每个办法看成一个策略,我们可以选择其中一个合适策略来解决问题。同时,我们可以方便的更换策略或者增加策略。
策略模式比较容易理解,该模式通过增加一个抽象策略类来定义策略角色。而我们面向抽象编程,使策略模式变得容易扩展。
举例:
小明去上学,可以走路,可以骑自行车,可以坐公交车,他的每一种去学校方式都可以看作解决”去学校“这个问题的策略。去学校是目的,去学校方式是过程,而策略模式所带来的便利恰恰是为你在这个过程中提供多个选择。
策略模式很好的体现了一句外国名言:条条大路通罗马(All roads lead to Rome)
策略模式UML类图:
其实这副类图是我从上个状态模式类图上简单修改得到的,这也能看出,有时候我们其实类的结构类的关系是差不多的,但为了解决不同问题,我们人为给它赋予了模式名称。
示例代码:
环境类(使用策略的类):
/*****
* 环境类
* @author wjw
*
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
/*****
* 去学校方法
*/
public void gotoSchool(){
System.out.println("小明--" + strategy.howToGetToSchool() + "--去学校!");
}
}
抽象策略类:
/*******
* 抽象策略类
* @author wjw
*
*/
public abstract class Strategy {
public abstract String howToGetToSchool();
}
步行 骑车 公交车策略类:
/****
* 步行策略类
* @author wjw
*
*/
public class WalkStrategy extends Strategy{
@Override
public String howToGetToSchool() {
// TODO Auto-generated method stub
return "步行";
}
}
/****
* 骑车策略类
* @author wjw
*
*/
public class RideStrategy extends Strategy{
@Override
public String howToGetToSchool() {
// TODO Auto-generated method stub
return "骑自行车";
}
}
/****
* 公交策略类
* @author wjw
*
*/
public class BusStrategy extends Strategy{
@Override
public String howToGetToSchool() {
// TODO Auto-generated method stub
return "公交车";
}
}
Main类:
public class Main {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//利用反射,通过配置文件new具体策略对象
Class strategyClazz = Class.forName(ReadProperties.readProperties("strategy_name"));
Strategy strategy = (Strategy)strategyClazz.newInstance();
Context context = new Context(strategy);
context.gotoSchool();
}
}
运行结果:
小明--骑自行车--去学校!
说明:实例代码通过选择不同策略上学来讲解策略模式,通过反射,在运行期选择具体策略。该示例代码很好理解,主要是理解了策略模式的定义。
设计模式是一个润物细无声的东西,你没感觉用到他,可能你已经用了,因为人会不自觉的选择好的方法去解决问题,哪怕没学过设计模式,也许也能摸索出自己的设计模式。你感觉这设计模式用处不大,可能到真的用到,就可以解决大问题。
如有错误,欢迎指正
end