设计模式(21)--策略模式

来源:互联网 发布:淘宝店铺怎么发布微淘 编辑:程序博客网 时间:2024/06/06 08:55

策略模式即解决问题的策略。当我们需要解决某个问题时,可能会有多种解决问题的办法,这时候,可以将每个办法看成一个策略,我们可以选择其中一个合适策略来解决问题。同时,我们可以方便的更换策略或者增加策略。

策略模式比较容易理解,该模式通过增加一个抽象策略类来定义策略角色。而我们面向抽象编程,使策略模式变得容易扩展。

举例:

小明去上学,可以走路,可以骑自行车,可以坐公交车,他的每一种去学校方式都可以看作解决”去学校“这个问题的策略。去学校是目的,去学校方式是过程,而策略模式所带来的便利恰恰是为你在这个过程中提供多个选择。

策略模式很好的体现了一句外国名言:条条大路通罗马(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{@Overridepublic String howToGetToSchool() {// TODO Auto-generated method stubreturn "步行";}}



/**** * 骑车策略类 * @author wjw * */public class RideStrategy extends Strategy{@Overridepublic String howToGetToSchool() {// TODO Auto-generated method stubreturn "骑自行车";}}

/**** * 公交策略类 * @author wjw * */public class BusStrategy extends Strategy{@Overridepublic String howToGetToSchool() {// TODO Auto-generated method stubreturn "公交车";}}

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


原创粉丝点击