策略设计模式
2017-07-08 14:43
204 查看
网上有许多关于策略设计模式的介绍,其实在策略设计模式就是一句话将执行策略封装成对象,不同的具体策略对象会对相同的输入产生不同的结果。前半句是策略设计模式,后半句就是多态。可以说策略设计模式离不开多态。首先简单地讲一下策略设计模式。
我觉得uml图是讲解设计模式最好的工具,直接上图。
策略设计模式如图无非就是通过一个上下文来调用具体策略的方法,代码如下:
然而这种方式存在一个缺陷,在客户端实例化了策略类,导致代码的耦合度过高。我们是否可以考虑不在客户端直接实例化策略类呢。结合简单工厂方法,我们将Context类修改为如下:
现在代码实现了策略类和客户端的解耦,然而事实上,
1:Context类和客户端并没有解耦
2:添加新的策略需要修改Context类(添加新的分支),不利于程序的扩展
首先解决第一个问题,我们开发常常使用Spring,这里就使用Spring的依赖注入,将Context交给Spring容器管理,这里就不介绍Spring了。这样其实连Context都和客户端解耦了。
接着解决第二个问题,我们可以考虑使用反射来解决这个问题,根据传进来的类型type决定实例化哪个策略对象。这的确是一种不错的方法,然而当使用Spring进行开发的时候,使用了反射就浪费了Spring本身的依赖注入功能了。所以我们就不选择反射了,那么不选择反射如何实现不修改分支就可以动态添加策略呢?最好的方式是在Context中new一个HashMap,将策略实例通过依赖注入的方式注入到这个map中。通过传入的参数决定key,通过key决定调用哪个策略对象。这样完美地将策略设计模式与Spring的依赖注入结合,也实现了完美的解耦。所以设计模式并不是死的,灵活的运用设计模式才是王道。
我觉得uml图是讲解设计模式最好的工具,直接上图。
策略设计模式如图无非就是通过一个上下文来调用具体策略的方法,代码如下:
//策略接口 public Interface Strategy{ public void method(); } //策略具体实现类1 public Class StrategyOne implements Strategy{ public void method(){.....} } //策略具体实现类2 public Class StrategyTwo implements Strategy{ public void method(){.....} } //Context类 public Class Context{ private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public void execute(){ strategy.method(); } } //客户端调用 public static void main(String[] args){ Strategy strategyOne = new StrategyOne(); Context context = new Context(strategyOne); context.execute(); }
然而这种方式存在一个缺陷,在客户端实例化了策略类,导致代码的耦合度过高。我们是否可以考虑不在客户端直接实例化策略类呢。结合简单工厂方法,我们将Context类修改为如下:
public Class Context { public void execute(String type){ if(type.equals("策略一")){ new StrategyOne().method(); }else if(type.equals("策略二")){ new StrategyTwo().method(); }else{ //....... } } }
现在代码实现了策略类和客户端的解耦,然而事实上,
1:Context类和客户端并没有解耦
2:添加新的策略需要修改Context类(添加新的分支),不利于程序的扩展
首先解决第一个问题,我们开发常常使用Spring,这里就使用Spring的依赖注入,将Context交给Spring容器管理,这里就不介绍Spring了。这样其实连Context都和客户端解耦了。
接着解决第二个问题,我们可以考虑使用反射来解决这个问题,根据传进来的类型type决定实例化哪个策略对象。这的确是一种不错的方法,然而当使用Spring进行开发的时候,使用了反射就浪费了Spring本身的依赖注入功能了。所以我们就不选择反射了,那么不选择反射如何实现不修改分支就可以动态添加策略呢?最好的方式是在Context中new一个HashMap,将策略实例通过依赖注入的方式注入到这个map中。通过传入的参数决定key,通过key决定调用哪个策略对象。这样完美地将策略设计模式与Spring的依赖注入结合,也实现了完美的解耦。所以设计模式并不是死的,灵活的运用设计模式才是王道。
相关文章推荐
- 设计模式之Strategy(策略)
- 设计模式之策略模式(strategy)--游戏角色使用武器
- [设计模式] 23.Strategy 策略模式
- [★] .NET 偶尔连接的设计策略 -联机状态- 脱机模式- 数据同步
- 设计模式袖珍版 连续转载之 - Strategy(策略)
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
- 设计模式随笔系列:鸭子-策略模式(Strategy)[原]
- 设计模式之Strategy(策略)
- 设计模式之策略模式探讨初步[引]
- 设计模式随笔系列:鸭子-策略模式(Strategy)[转]
- 设计模式之Strategy(策略)
- Java设计模式学习之一---策略模式
- AspectJ实现设计模式(二)——策略模式
- 设计模式之策略模式探讨初步
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式与泡mm的关系之strategy策略模式及再思考
- 设计模式之Strategy(策略)
- 设计模式随笔系列:鸭子-策略模式(Strategy)
- 设计模式(20)-策略模式(Strategy)