Template Method模式和Strategy模式都可以分离通用的算法和具体的上下文,所解决的问题是类似的,但是实现的方法不同,一个是用的继承,一个是用的委托。
我们先来看一下Template 的结构图:
Template Method模式实际上就是利用面向对象中多态的概念实现算法实现细节和高层接口的松耦合。Template Method模式展示了面向对象编程中诸多经典重用形式中的一种。其中通用算法被放置到基类中,并且通过继承在不同的具体上下文中实现该共同算法。但由于继承是一种强约束性的条件,派生类不可避免地要和它们的基类绑定到一起。
Strategy模式使用了一种非常不同的方法来倒置通用算法和具体时间之间的依赖关系。当Template Method模式和Strategy模式进行比较时,我们尽量多用组合的方式少用继承。Strategy模式的结构图:
不是将通用的算法放到基类中而是放到ApplicationRunner的具体类中。而把通用算法必须要调用的抽象方法定义在一个名为Application的接口中,我们的ApplicationRunner只依赖于Application接口,具体实现在ftocStrategy这个具体类中。这个设计很符合依赖倒置原则,降低了基类和派生类之间的耦合度。
但是我们在选择用哪个设计模式的时候要慎重,切记设计过度。一般比较简单的情况用Template Method模式已经足够。
我们先来看一下Template 的结构图:
Template Method模式实际上就是利用面向对象中多态的概念实现算法实现细节和高层接口的松耦合。Template Method模式展示了面向对象编程中诸多经典重用形式中的一种。其中通用算法被放置到基类中,并且通过继承在不同的具体上下文中实现该共同算法。但由于继承是一种强约束性的条件,派生类不可避免地要和它们的基类绑定到一起。
Strategy模式使用了一种非常不同的方法来倒置通用算法和具体时间之间的依赖关系。当Template Method模式和Strategy模式进行比较时,我们尽量多用组合的方式少用继承。Strategy模式的结构图:
不是将通用的算法放到基类中而是放到ApplicationRunner的具体类中。而把通用算法必须要调用的抽象方法定义在一个名为Application的接口中,我们的ApplicationRunner只依赖于Application接口,具体实现在ftocStrategy这个具体类中。这个设计很符合依赖倒置原则,降低了基类和派生类之间的耦合度。
但是我们在选择用哪个设计模式的时候要慎重,切记设计过度。一般比较简单的情况用Template Method模式已经足够。