策略模式的思考

来源:互联网 发布:淘宝主图视频pr 编辑:程序博客网 时间:2024/05/16 18:05

实际情况中,经常遇到对同一件事情有多个处理策略的时候,比如现在从武汉到北京,就有海陆空三种策略,都能达到目的。

针对上述情况,初学的时候我们可能采取如下方式实现:

public class ChooseStrategy {public void GoByAir(){System.out.println("乘坐飞机");}public void GoByShip(){System.out.println("乘坐轮船");}public void GoByTrain(){System.out.println("乘坐火车");}//根据不同的条件选择不同的策略前往目的地public void GoToDestination(int condition){switch(condition){case 0:GoByAir();break;case 1:GoByShip();break;case 2:GoByTrain();break;}}public static void main(String[] args) {ChooseStrategy choose=new ChooseStrategy();choose.GoToDestination(0);}}
这样就可以根据不同的条件选择不同的方式前往目的,但是考虑到程序的变更,当我们需要增加新的策略的时候需要手动的增加case语句和新的方法,下面采用策略模式对比实现上面的功能。

采用策略模式,需要提供一个StrategyContext类,该类用于为客户端代码选择合适的折扣策略,也可以让客户端修改自己需要的策略。其UML如下图:


代码实现如下:

public class StrategyContext {private Strategy strategy;public void GoToDestination(){//如果策略为空默认采用一种策略   乘坐飞机if(strategy==null){strategy=new AirStrategy();}strategy.GoToDestination();}//更改策略public void ChangeStrategy(Strategy strategy){this.strategy=strategy;}public static void main(String[] args) {StrategyContext context=new StrategyContext();context.GoToDestination();context.ChangeStrategy(new TrainStrategy());context.GoToDestination();}}
如此,当我们需要增加策略的时候只需要增加一个类继承Strategy接口同时程序的代码并不直接依赖于具体的某个实现策略,只是依赖于策略的选择类StrategyContext类,这就是策略模式。

思考,当我们使用hibernate的时候会使用hibernateTemplate或则hsql而不去管数据库的具体实现,当我们需要使用mySql的时候需要指定数据库的方言Dialect为MySql,使用Oracle或者SqlServer的时候也只需要修改Dialect不需要修改sql语句,不就是策略模式带来的好处吗,同样的数据源Resource的使用也是如此。

0 0
原创粉丝点击