设计模式之模板方法模式和策略模式

来源:互联网 发布:java一对一聊天程序 编辑:程序博客网 时间:2024/05/16 16:20

本文主要讲的是模板模式和策略模式,两者所要解决的问题经常是类似的,而且常常可以互换使用,都可以分离通用的算法和具体的上下文。不过,模板模式使用继承来解决问题,而策略模式使用的则是委托。

一、模板方法模式

举个排序算法的例子:

重构前:



BubbleSorter类知道如何运用冒泡排序算法为一个整数数组排序。BubbleSorter类的sort方法包含了进行冒泡排序的算法。另外两个辅助方法,swap和compareAndSwap,用来处理整数和数组的细节问题以及排序算法需要的一些技术方法。


重构后:

使用模板方法模式,我们可以把具体的冒泡排序算法分离出来,放到一个名为BubbleSorter的抽象基类中。BubbleSorter实现sort方法,sort方法调用名为outOfOrder和swap的抽象方法。这两个抽象方法则又派生类来实现。

UML图:


程序:





模板方法模式展示了面向对象编程中诸多经典重用形式中的一种。其中通用算法被放置在基类中,并且通过继承在不同的具体上下文中实现该通用算法。但是继承是一种非常强的关系,派生类不可避免地要和它们的基类绑定在一起。


模板方法的使用场景:

 ● 多个子类有公有的方法,并且逻辑基本相同时;

 ● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现;

 ● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。


二、策略模式

所谓策略模式,即指定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

同样举上面那个排序的例子:

UML图:


程序:





BubbleSorterContext:也叫上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

BubbleSorterStrategyInterface:策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。

IntBubbleSorterStrategy、DoubleBubbleSorterStrategy:实现抽象策略中的操作,该派生类中含有具体的算法。


一般策略模式的使用场景:

 ● 多个类只有在算法或行为上稍有不同的场景。

 ● 算法需要自由切换的场景。

 ● 需要屏蔽算法规则的场景。

 

策略模式的缺点:

 ● 策略类数量有可能会很多。

 ● 所有的策略类都需要对外暴露。

对于上面提到的亮点缺点,可以使用其他模式配合使用来修正,如工厂方法模式、代理模式或享元模式。


结论:模板方法模式和策略模式都可以用来分离高层的算法和底层的具体实现细节。都允许高层的算法独立于它的具体实现细节重用。此外,策略模式也允许具体实现细节独立于高层的算法重用,不过要以一些额外的复杂性、内存以及运行时间作为代价。


附加:

对于策略模式,有一种扩展,名为策略枚举。

例如现在有一个简单的题目:输入3个参数,进行加减运算,参数中两个是int型的,剩下的一个参数是String型的,只有"+"、"-"两个符号选择。

如果直接用策略枚举来完成这个问题,程序如下:



看这个场景类,代码量非常少,而且有一个显著的有点:真实地面向对象,看看这条语句:Calculator.Add.exec(a, b),是不是类似于“拿出计算器(Calculatro)”,对a和b进行加法操作(Add),并立刻执行(exec)。

1 0
原创粉丝点击