- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
15模板方法模式
.NET设计模式(16):模版方法(Template Method)
摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要。
主要内容
1.概述
2.Template Method解说
3..NET中的Template Method模式
4.适用性及实现要点
?
概述
变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对。如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识。
意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[-GOF《设计模式》]
结构图
图1 Template Method 模式结构图
?
生活中的例子
模板方法定义了一个操作中算法的骨架,而将一些步骤延迟到子类中。房屋建筑师在开发新项目时会使用模板方法。一个典型的规划包括一些建筑平面图,每个平面图体现了不同部分。在一个平面图中,地基、结构、上下水和走线对于每个房间都是一样的。只有在建筑的后期才开始有差别而产生了不同的房屋样式。
图2 使用建筑图为例子的Template Method模式
Template Method模式解说
李建忠老师说过一句话,如果你只想掌握一种设计模式的话,那这个模式一定是Template Method模式。对于这个问题,我想可能是仁者见仁,智者见智,但是有一点不能否认的Template Method模式是非常简单而且几乎是无处不用,很少有人没有用过它。下面我们以一个简单的数据库查询的例子来说明Template Method模式(注意:这个例子在实际数据库开发中并没有任何实际意义,这里仅仅是为了作为示例而已)。
假如我们需要简单的读取Northwind数据库中的表的记录并显示出来。对于数据库操作,我们知道不管读取的是哪张表,它一般都应该经过如下这样的几步:
1.连接数据库(Connect)
2.执行查询命令(Select)
3.显示数据(Display)
4.断开数据库连接(Disconnect)
这些步骤是固定的,但是对于每一张具体的数据表所执行的查询却是不一样的。显然这需要一个抽象角色,给出顶级行为的实现。如下图:
图3
Template Method模式的实现方法是从上到下,我们首先给出顶级框架DataAccessObject的实现逻辑:
public燼bstract燾lass燚ataAccessObject框架D{牋牋protected爏tring燾onnectionString;框架D牋牋protected燚ataSet燿ataSet;Stri牋牋public爒irtual爒oid燙onnect()ring;牋牋pu{?p牋牋牋牋connectionString??nect()牋牋牋牋牋牋Server=Rj-097;User營d=sa;Password=sa;Database=Northwind;过如下这样的几牋牋}牋牋牋牋public燼bstract爒oid燬elect();;Pass牋牋public燼bstract爒oid燚isplay();Passw牋牋public爒irtual爒oid燚isconnect()asswo牋牋pu{牋牋牋牋connectionString??;nect()牋牋}co牋牋//燭he?Template燤ethod?nect(牋牋public爒oid燫un()thod牋牋pu{牋牋牋牋Connect();()t牋牋牋牋Select();()牋牋牋牋Display();()t牋牋牋牋Disconnect();thod????}}
显然在这个顶级的框架DataAccessObject中给出了固定的轮廓,方法Run()便是模版方法,Template Method模式也由此而得名。而对于Select()和Display()这两个抽象方法则留给具体的子类去实现,如下图:
图4
示意性实现代码:
class燙ategories?燚ataAccessObject定的轮{牋牋public爋verride爒oid燬elect()ect定牋牋pu{牋牋牋牋string爏ql??select燙ategoryName爁rom燙ategories;法,Template牋牋牋牋SqlDataAdapter燿ataAdapter?爊ew燬qlDataAdapter(法,Templ牋牋牋牋牋牋sql,燾onnectionString);?爊ew燬ql牋牋牋
文档评论(0)