Design Patterns
模板方法模式
刘 伟 (Sunny)\rweiliu_china@126.com
大纲
\r
模板方法模式概述\r模板方法模式的结构与实现\r模板方法模式的应用实例\r钩子方法的使用\r模板方法模式的优缺点与适用环境\r
插卡\r验证\r业务处理(存款/取款/转账……)\r退卡
模板方法模式概述
请客吃饭示意图
模板方法模式概述
分析\r请客吃饭:(1) 点单 ? (2) 吃东西? (3) 买单\r软件开发:某个方法的实现需要多个步骤(类似“请客”),其中有些步骤是固定的(类似“点单”和“买单”),而有些步骤并不固定,存在可变性(类似“吃东西”)\r模板方法模式:基本方法(“点单”、“吃东西”和“买单”) 模板方法( “请客”)\r
模板方法模式概述
模板方法模式的定义\r\r\r\r\r\r类行为型模式
模板方法模式概述
模板方法模式的定义\r是一种基于继承的代码复用技术\r将一些复杂流程的实现步骤封装在一系列基本方法中\r在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果
模板方法模式的结构与实现
模板方法模式的结构\r\r
模板方法模式的结构与实现
模板方法模式的结构\r模板方法模式包含以下两个角色:\rAbstractClass(抽象类)\rConcreteClass(具体子类)
模板方法模式的结构与实现
模板方法模式的实现\r模板方法 (Template Method)\r基本方法 (Primitive Method)\r抽象方法(Abstract Method)\r具体方法(Concrete Method)\r钩子方法(Hook Method)
模板方法模式的结构与实现
模板方法模式的实现\r钩子方法\r(1) “挂钩”方法: IsXXX(),返回类型为bool类型\r\r(2) 空方法
模板方法模式的结构与实现
模板方法模式的实现\r抽象类典型代码:\r
模板方法模式的结构与实现
模板方法模式的实现\r具体子类典型代码:\r
模板方法模式的应用实例
实例说明
模板方法模式的应用实例
实例类图
银行利息计算模块结构图
模板方法模式的应用实例
实例代码\r(1) Account:账户类,充当抽象类\r(2) CurrentAccount:活期账户类,充当具体子类\r(3) SavingAccount:定期账户类,充当具体子类\r(4) 配置文件App.config\r(5) Program:客户端测试类
演示……
参考代码 (DesignPattern\TemplateMethodSample)
模板方法模式的应用实例
结果及分析\r如果需要更换或增加具体子类,无须修改源代码,只需修改配置文件App.config即可,符合开闭原则\r\r\r\r
钩子方法的使用
实例\r\r\r\r\r
钩子方法的使用
结构\r\r\r\r\r
数据图表显示功能结构图
钩子方法的使用
实现\r\r\r\r\r
演示……
参考代码 (DesignPattern\TemplateMethodSample)
模板方法模式的优缺点与适用环境
模式优点\r在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序\r提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为\r可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行\r更换和增加新的子类很方便,符合单一职责原则和开闭原则
模板方法模式的优缺点与适用环境
模式缺点\r需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统会更加庞大,设计也会更加抽象(可结合桥接模式)\r
模板方法模式的优缺点与适用环境
模式适用环境\r一次性实现一个算法的不变部分,并将可变的行为留给子类来实现\r各子类中公共的行为应被提取出来,并集中到一个公共父类中,以避免代码重复\r需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制\r
思考
在模板方法模式中,钩子方法如何实现子类控制父类的行为?
END
Thanks!