我的Design Pattern之旅[2]:Template Method Pattern(OO)

Abstract

template method pattern是我学到第二个pattern,算是一个很容易理解的pattern,但却非常的实用。

Intent

对於operation,只先定义好演算法的轮廓,某些步骤则留给子类别去填补,以便在不改变演算法整体架构的情况下让子类别去精链某些步骤。

其UML表示法


在实务上,我们可能本来有一个功能完整的class,但因为『需求改变』,新的class和原来的class几乎60%相同, 只有40%不一样,因此我们希望将60%相同部份的程式留下来,仅改写40%不同的地方。

如本来某公司只生产『自动泡茶机』,後来为了增加产品线,想生产『自动泡咖啡机』,经过分析,两台机器的架构相似,生产流程也相似。

自动泡茶机

step1 : 将开水煮开

step2 : 将<茶叶>放入开水

step3 : 将<茶>倒入杯子

step4 : 加上<柠檬>

自动泡咖啡机

step1 : 将开水煮开

step2 : 将<咖啡粉>放入开水

step3 : 将<咖啡>倒入杯子

step4 : 加上<糖>和<奶精>

很明显的step1相同,但step2 ~ step4不相同,所以只需改写step2 ~ step4,step1可以继续使用。先设计一个DrinkMachine雏型,定义了生产过程和step1,因为step2 ~ step4各有差异,就留在继承DrinkMachine的class去改写,这就是template method pattern。


我们看看这个架构,日後若有新drink加入,DrinkMachine,TeaMachine,CoffeeMachine皆不用修改,符合OCP的closed for modification原则,若要加入新的class,只计程并改写DrinkMachine即可,符合OCP的open for extension原则,所以是非常好维护的架构。

简言之,template method pattern就是将不同的member function用class包起来,由derived class去改写。

时间: 2024-10-04 00:54:54

我的Design Pattern之旅[2]:Template Method Pattern(OO)的相关文章

乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) 作者:webabcd 介绍 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 示例 有一个Message实体类,对它的操作有Get()方法,每次Get()之前要使用ValidateUs

我的Design Pattern之旅[1]:Strategy Pattern (OO)

Abstract Head First Design Patterns是用strategy pattern当作第一个范例,而陈俊杉教授也是用strategy当作授课的第一个pattern,可见strategy的确适合初学者学第一个学习的pattern. Intent 定义一整族演算法,将每一个演算法封装起来,可互换使用,更可以在不影响外界的情况下各别抽换所引用的演算法. 其UML表示法 GoF说strategy也称为policy,我个人喜欢称它为plugin,因为可以动态的换演算法,如同在ecl

我的Design Pattern之旅[6]:Adapter Pattern(OO)

Abstract 在OO設計裡,我們常會定下interface要求其他class必須實現此interface,以便彼此溝通,若是新開發的專案,問題就不大:若既有的framework/library中,已經有符合需求的class,但唯一可惜的是,『因為interface並不相同』,導致無法和我的class合作,此時可使用Adpater Pattern解決. Intent 将class的interface转换成外界所预期的另一种interface,让原先囿於interface不相容问题而无法协力合作

我的Design Pattern之旅[5]:Facade Pattern(OO)

Intent 替子系统里的一堆介面定义一套统一的高阶介面,让子系统更易使用. Introduction Facade常用在两个地方,第一种用法是将原来程序导向的系统,利用Facade包成OO,如MFC包装Win32 API,第二种用法是将原来复杂的OO系统,再包成更简单的OO,如.NET Enterprise Library将.NET Framework再做一次包装,让你更容易使用.NET.另外3-tier也是典型Facade的应用,DAL(Data Access Layer)就是一个Facad

Python语言:定制pattern的string模板(template) 详解

string.Template的pattern是一个正则表达式, 可以通过覆盖pattern属性, 定义新的正则表达式. 如: 使用新的定界符"{{", 把{{var}}作为变量语法. 代码: # -*- coding: utf-8 -*- ''''' Created on 2014.6.5 @author: Administrator @edition : python 3.3.0, eclipse pydev ''' import string t = string.Templat

.Net设计模式实例之模板方法模式(Template Mothed Pattern)

一.模板方法模式简介(Brief Introduction) 模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤 延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可以重定义算法的某些特定 步骤.模板方法模式把不变行为搬移到超类,从而去除子类中的重复代码,实际上模板方法 模式就是提供了一个代码复用平台. 二.解决的问题(What To Solve) 要完成在某一细节上层次一致的一个过程或一系列步骤,但个别步骤在更详细的层次上 实现不同时,

设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关. 例子1:银行业务办理流程 在银行办理业务时,一般都包含几个基本固定步骤: 取号排队->办理具体业务->对银行工作人员进行评分. 取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能

Template Method(模板方法)模式

1.概述   在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->办理具体业务->对银行工作人员进行评分.取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账.   2.问题   如何保证架构逻辑的正常执行,而不被子类破坏 

我的Design Pattern之旅[3]:使用template改進Strategy Pattern(OO)

在(原创) 我的Design Pattern之旅:Strategy Pattern (初级) (Design Pattern) (C++) (OO C++) (Template C++)中,我们使用了strategy pattern让Grapher能画Triangle.Circle和Square 因为需求再次改变,:D,我们希望Grapher能将文字印在各Shape中,执行结果如下 Draw Hello Shape!! in Square Draw Hello C++!! in Circle 为