- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
模板方法
模板方法(Template Method)
无处不在的Template Method ??? 如果你只想掌握一种设计模式,那么它就是Template Method!动机(Motivate):??? 变化 -----是软件设计的永恒主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现系统中的变化和稳定点,并使用特定的设计方法来应对这种变化。意图(Intent):??? 《设计模式》GOF结构图(Struct):??? ?? ?? ?? ?? ??? 适用性:???
2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3.控制子类扩展。模板方法只在特定点调用“Hook”操作,这样就只允许在这些点进行扩展。生活中的例子:??? ?? ?? ?? ?? 代码实现:
??? 假如我们需要简单的读取Northwind数据库中的表的记录并显示出来。对于数据库操作,我们知道不管读取的是哪张表,它一般都应该经过如下这样的几步:
1.连接数据库(Connect)
2.执行查询命令(Select)
3.显示数据(Display)
4.断开数据库连接(Disconnect)
这些步骤是固定的,但是对于每一张具体的数据表所执行的查询却是不一样的。显然这需要一个抽象角色,给出顶级行为的实现。如下图:?????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????? Template Method模式的实现方法是从上到下,我们首先给出顶级框架DataAccessObject的实现逻辑:
?1?public?abstract?class?DataAccessObject?2??3?{?4?????protected?string?connectionString;?5??6?????protected?DataSet?dataSet;?7??8???? protected virtual?void?Connect()?9?10?????{?11?????????connectionString?=?12?13?????????????Server=.;User?Id=sa;Password=;Database=Northwind;14?15?????}16?17??? protected? abstract?void?Select();18?19???? protected abstract?void?Display();20?21?22???? protected virtual?void?Disconnect()23?24?????{25?????????connectionString?=?;26?????}27?28?????//?The?Template?Method?29?30?????public?void?Run()31?32?????{33?????????Connect();34?35?????????Select();36?37?????????Display();38?39?????????Disconnect();40?????}41?}
显然在这个顶级的框架DataAccessObject中给出了固定的轮廓,方法Run()便是模版方法,Template Method模式也由此而得名。而对于Select()和Display()这两个抽象方法则留给具体的子类去实现,如下图:??? ?? ????????????
?1?class?Categories?:?DataAccessObject?2??3?{?4?????protected?override?void?Select()?5?????{?6?????????string?sql?=?select?CategoryName?from?Categories;?7??8?????????SqlDataAdapter?dataAdapter?=?new?SqlDataAdapter(?9?10?????????????sql,?connectionString);11?12?????????dataSet?=?new?DataSe
文档评论(0)