策略模式即解决问题的策略。当我们需要解决某个问题时,可能会有多种解决问题的办法,这时候,可以将每个办法看成一个策略,我们可以选择其中一个合适策略来解决问题。同时,我们可以方便的更换策略或者增加策略。
策略模式比较容易理解,该模式通过增加一个抽象策略类来定义策略角色。而我们面向抽象编程,使策略模式变得容易扩展。
举例:
小明去上学,可以走路,可以骑自行车,可以坐公交车,他的每一种去学校方式都可以看作解决”去学校“这个问题的策略。去学校是目的,去学校方式是过程,而策略模式所带来的便利恰恰是为你在这个过程中提供多个选择。
策略模式很好的体现了一句外国名言:条条大路通罗马(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