`

比较Template method、Strategy和Builder模式随想

阅读更多
Template method和Strategy模式经常在框架设计中被使用,并且二者很相似,都是父类定义功能接口,将具体的实现留个子类,有时二者可以相互替换。
Template method主要是父类将一个功能的实现分成几个小的步骤,并且在模版方法中规定了这些步骤的执行顺序,同时定义了这些子步骤的protected类型的方法留给子类实现,声明为protected主要是以防止用户不恰当的使用这些方法而产生异常。实现者不需要考虑这些子步骤地执行顺序,只需要实现具体的功能就行了。其实每一个子类去具体的实现这些子步骤,也有策略的味道,只不过Template method主要是在父类封装了子步骤地顺序,从而简化用户的负担以及减少重复的代码的目的。
Strategy模式主要是父类(更常用的是接口)定义一个具体的功能,不同的子类使用不同的策略去具体的实现。其实针对接口编程,一方面达到依赖于接口而不是具体实现的目的,另一方面也是策略模式的一个实现吧,接口规定了功能,不同的实现者提供了不同的策略。常用的Dao模式提供了隔离数据访问与业务层的同时,也提供了可替换的策略,来方便在不同的数据库间移植,或者使用不同的技术来实现。
Template method适用域可能更小一点,灵活性也差一点。如果子类也可以订制这些子步骤的顺序,那就不适合使用Template。使用策略模式,则没有那么多的限制,甚至常常没有子步骤。不过实现者需要知道整个算法的流程,同时也可能暴露过多的行为,从而可能造成使用者误用的可能。
谈到Template method,我倒想到了Builder模式,虽然二者一个是行为模式,一个是创建型模式,但是二者还是有不少相似之处的。Builder模式是隐藏创建的过程,使用者只需要使用build方法就能够获得整个要创建的东西,而不需要考虑具体的创建步骤,Builder模式其实也算(或者可以)用模版方法来实现,只不过这个模版方法是创建对象的而已。
分享到:
评论
8 楼 fuliang 2007-04-21  
引用
Template怎么会和Builder相似呢?可以看看这两种模式的类图,差别不是一点点啊!!

是不一样,我的意思是他们都把一个过程分成若干个小的步骤,
并隐藏这个复杂的过程,当我们使用的时候而不需要考虑具体的步骤,并可以轻易替换掉实现。
其实各个模式都有一些关联的地方,说这两个说相似可能也不恰当。
7 楼 solospider 2007-04-20  
刑天战士 写道
大部分模式,在你熟悉了OO之后慢慢地都会“忘记”,不用管他什么什么相似不相似,叫什么名字,真的没有必要……
嗯,同意,当把这些模式的上下文,解决的问题,搞清楚之后,模式的概念基本上可以淡化了。
不过不得不说有的时候模式是一个很好的沟通工具,当描述一个设计的时候,只需要告诉别人我用的是什么模式就可以了,没必要具体描述这个设计是什么。
6 楼 刑天战士 2007-04-20  
大部分模式,在你熟悉了OO之后慢慢地都会“忘记”,不用管他什么什么相似不相似,叫什么名字,真的没有必要……
5 楼 dovecat 2007-04-20  
关键在于模式针对问题域而出现,
问题域是因,模式就是果.
问题弄清楚了,对于模式自然就理解了,
某些时候我们完全可以跳出当前模式的默认实现方式而自定义自己的模式的实现方式.模式绝不是孤立的存在的.
所以就模式而讨论模式,可能稍微有点偏驳.
4 楼 jamesby 2007-04-20  
daynight830 写道
Template怎么会和Builder相似呢?可以看看这两种模式的类图,差别不是一点点啊!!
恩,我也觉得这两个东西没有什么相似之处.
Builder更象factory.
而template更象callback.
3 楼 daynight830 2007-04-19  
Template怎么会和Builder相似呢?可以看看这两种模式的类图,差别不是一点点啊!!
2 楼 fuliang 2007-04-18  
jamesby 写道
设计模式是否相同应该根据目的/解决什么问题来划分,而不应该根据其结构来划分,很多设计模式都具有相似的类层次结构但是确实不同的模式。


同意。GOF就是那么分类的,不同类型的模式可能有相同或相似的结构。
象Template method和Builder就感觉挺相似的。
1 楼 jamesby 2007-04-18  
设计模式是否相同应该根据目的/解决什么问题来划分,而不应该根据其结构来划分,很多设计模式都具有相似的类层次结构但是确实不同的模式。

相关推荐

Global site tag (gtag.js) - Google Analytics