`
ihuashao
  • 浏览: 4721079 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

第二十一章 模板方法(Template Method)

阅读更多

第二十一章 模板方法(Template Method)

什么是模板方法呢?我们先回想以下SQL保存的例子,这个例子要求我们能够同时处理三种类型的SQL语句保存文件:XML格式的文件,Properties格式文件和普通的文本格式的文件。不论那种格式的文件都要求能够提供根据SQL语句名字获得SQL语句的方法。我们可以这样子设计:

public class AbstractSqlManager {

private Map sqlMap ;

public AbstractSqlManager(String filePath) {

sqlMap = initSqlMap(filePath)

}

publicString getSql(String key) {

return (String)sqlMap.get(key);

}

public abstract Map initSqlMap(String filePath);

}

public class XmlSqlManager extends AbstractSqlMamager {

public Map initSqlMap(String filePath) {

// 解析XML文件将SQL语句,以SQL语句的名字为Key,放在sqlMap中。

}

}

public class PropertiesSqlManager extends AbstractSqlMamager {

public Map initSqlMap(String filePath) {

// 解析Properties文件将SQL语句,以SQL语句的名字为Key,放在sqlMap中。

}

}

public class TextSqlManager extends AbstractSqlMamager {

public Map initSqlMap(String filePath) {

// 解析Text文件将SQL语句,以SQL语句的名字为Key,放在sqlMap中。

}

}

参看上述的代码,在AbstractSqlManager中,因为可能处理的文件的内容不同,所以将解析不同代码的方法实现放在了具体的类(XmlSqlManager ,PropertiesSqlManager 和TextSqlManager )中,只在AbstractSqlManager中实现了getSql方法。

我们在来考虑三个具体的实现类,在这些类实现的时候,需要从AbstractSqlManager集成,所以必须实现initSqlMap这个方法,并且必须按照AbstractSqlManager中定义的格式(模板)来实现。

这样可以称initSqlMap为模板方法,也可以称上述的设计为模板方法。

模板方法设计的好处有那些呢?

第一,也是继承的好处,可以重用代码

如上述的例子,使用了模板方法之后,可以将公共的方法和流程在基类中编写,这样可以重用这些代码。(关于继承和组合重用代码的问题参看另外的相关讨论)

第二,可以灵活的对应变更

因为使用了模板方法,所以相同的操作可以在基类中完成,具体的不同实现可以在具体类中完成。所以首先有了变更修改的范围很容易确定,如果是通用的操作则需要在基类中完成,例如initSqlMap之前需要使用日志记录文件的信息。如果是特殊的操作则需要在具体类中完成,例如XML文件格式发生了变更。

第三,规范处理流程(例如有三个模板方法)

使用模板方法可以规范处理流程,例如要对输入的数进行相关的操作,我们可以定义这样的几个过程,(1)数据格式校验(2)数据逻辑校验(3)预处理(4)处理(5)处理输出值(6)结束

我们可以定义这样子一个基类,包含需要的模板方法:

public class BaseTarget{

public void execute(InputVO vo) throw ExecuteException{

try {

formatCheck(vo);

logicCheck(vo);

preProcess(vo);

OutputVO out = process(vo);

formatCheck(out);

} catch(FormatException ex) {

// 异常处理

} catch(LogicException ex) {

// 异常处理

} catch(PreProcessExceptionex) {

// 异常处理

} catch(ProcessExceptionex) {

// 异常处理

} catch(PostProcessExceptionex) {

// 异常处理

}

}

public abstract void formatCheck(InputVO vo) throw FormatException ;

public abstract void logicCheck(InputVO vo) throw LogicException ;

public abstract void preProcess(InputVO vo) throw PreProcessException;

public abstract OutputVO process(InputVO vo) throw ProcessException;

public abstract void postProcess(OutputVO vo) throw PostProcessException;

}

通过上述基类的定义,我们规定了子类型的处理内容(五个需要实现的抽象方法)和处理的顺序(按照execute方法定义的处理顺序执行)。

分享到:
评论

相关推荐

    第二十一讲:模板方法模式

    在给定的“TemplateMethod”文件中,可能包含了一个关于如何在Java或者其他编程语言中实现模板方法模式的示例代码。这个例子可能会演示如何定义一个抽象类,包含模板方法和抽象方法,以及创建一个或多个子类来定制...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第21章 模板方法(template method)模式 182 第22章 状态(state)模式 193 第23章 策略(strategy)模式 204 第24章 命令(command)模式 213 第25章 解释器(interpreter)模式 221 第26章 扩展型模式介绍 236 第27章 装饰...

    [源代码] 《易学 设计模式》 随书源代码

    第16章 按部就班:模板方法模式 (TemplateMethod) 第17章 风吹草动:观察者模式 (Observer) 第18章 变化多端:状态模式 (State) 第19章 明修栈道,暗度陈仓:策略模式 (Strategy) 第20章 循序渐进:职责链模式 ...

    研磨设计模式-part2

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...

    研磨设计模式(完整带书签).part2.pdf

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...

    研磨设计模式.part3(共4个)

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 ...

    研磨设计模式.part2(共4个)

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 ...

    研磨设计模式.part4(共4个)

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 ...

    研磨设计模式.part1(共4个)

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 ...

    研磨设计模式-part4

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...

    研磨设计模式-part3

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...

    研磨设计模式(完整带书签).part1.pdf

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...

    Delphi模式编程第一分卷

    第25章 模板方法模式(Template Method) 25.1 模式解说 25.2 结构与用法 25.2.1 模式结构 25.2.2 代码模板 25.2.3 问题讨论 25.3 范例与实践 25.3.1 模板方法在离线数据库系统中的应用 25.3.2 范例小结 第...

    Delphi模式编程第二分卷

    第25章 模板方法模式(Template Method) 25.1 模式解说 25.2 结构与用法 25.2.1 模式结构 25.2.2 代码模板 25.2.3 问题讨论 25.3 范例与实践 25.3.1 模板方法在离线数据库系统中的应用 25.3.2 范例...

    07-使用代理快速接入第三方库(1).html

    模板方法模式( Template Method ) 观察者模式( Observer ) 迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式...

    设计模式解析习题解答,已经做好目录标签

    - 第19章的模板方法模式(Template Method Pattern)定义了操作的框架,允许子类决定执行哪些步骤。 - 第21章涵盖了单例模式(Singleton Pattern)和双重检查锁定模式,保证类只有一个实例,并提供全局访问点。 - 第...

    C#设计模式_设计模式_C#_

    模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. ...

    Velocity模板使用指南中文版

    - **方法调用**:使用`${object.method(args)}`来调用对象的方法。 #### 八、属性查找规则 - **直接查找**:如果对象存在,则直接获取其属性值。 - **空对象处理**:如果对象不存在或为空,返回空字符串。 - **...

    第二十五 设计模式

    "第二十五 设计模式"这一主题通常指的是在设计模式的学习序列中,第25个被讨论的模式或者是关于设计模式的一个综合讨论。 设计模式分为三大类:创建型模式、结构型模式和行为型模式。这些模式各有其特点和应用场景...

    java8源码-LambdaPractice:《java8实战》代码练习

    1、添加设计模式代码实践,模板方法模式templateMethod,迭代器模式和组合模式iteratorAndComposite ####第九周完成工作 1、添加设计模式代码实践,命令模式command,适配器模式adapter ####第八周完成工作 1、第12章 ...

Global site tag (gtag.js) - Google Analytics