我也设计模式——23.Strategy
这个模式是对模板方法的简单包装,可以看到,只是多了一个Context类这个包装器。
以上UML图的代码很好实现,关键是Client如何使用Context类:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
客户端必须知道所有的策略类,从而会造成很多策略类,这是该模式的缺点。
基于委托的策略模式,可以解除Context与Strategy的耦合,于是ConcreteStrategyA与ConcreteStrategyB可以不是相同的父类。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
于是在Client这么调用代码:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
这个模式是对模板方法的简单包装,可以看到,只是多了一个Context类这个包装器。
以上UML图的代码很好实现,关键是Client如何使用Context类:
客户端必须知道所有的策略类,从而会造成很多策略类,这是该模式的缺点。
基于委托的策略模式,可以解除Context与Strategy的耦合,于是ConcreteStrategyA与ConcreteStrategyB可以不是相同的父类。
于是在Client这么调用代码: