设计模式学习笔记(十八:模板方法模式)

1.1概述

定义了一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这就是模板方法的定义。

类中的方法用以表明该类的实例所具有的行为,一个类可以有许多方法,而且类中的实例方法也可以调用该类中的其他若干个方法。在编写类的时候,可能需要将类的许多方法集成到一个实例方法中,即用一个实例方法封装若干个方法的调用,以表现一个算法的骨架,也就是说,调用该实例方法相当于按着一定顺序执行若干个方法。

例如,各类客运车站在安排乘客上车时都进行安全检查、验证车票、选择车体类型三个步骤(具体如下图一所示)。因此在一个抽象类Station中包含安全检查方法(safetyExamine)、验证车票方法(validateTicket)、选择车体类型方法(choiceCarriageType)表示乘车步骤的抽象方法,而且该抽象类中还包含有ridingStep()方法,该方法顺序调用安全检查方法、验证车票方法、选择车体类型方法,也就是说抽象类Station使用ridingStep()方法封装了乘车步骤。ridingStep()方法所调用的safetyExamine()、validateTicket()、choiceCarriageType()方法都是抽象方法,因此Station的子类:RailwayStation(火车站)在实现safetyExamine()、validateTicket()、choiceCarriageType()方法时,分别给出了自己的安全检查方式、检票车票方式和所选车体类型。当Station类声明的变量存放它的子类RailwayStation实例的引用后,该变量就可以调用ridingStep()方法展示乘客的乘车步骤。具体类关系图如下图一所示:

图一:乘车步骤

模板方法是关于怎样将若干个方法集成到一个方法中,以便形成一个解决问题的算法骨架。模板方法模式的关键是在一个抽象类中定义一个算法的骨架,即将若干个方法集成到一个方法中,并称该方法为一个模板方法,或简称为模板。模板方法所调用的其他方法通常称为抽象的方法,这些抽象方法相当于算法骨架中的各个步骤,这些步骤可以由子类去完成。

1.2模式的结构

模板方法模式包括以下两种角色:

(1)抽象模板(Abstract Template):抽象模板是一个抽象类。抽象模板定义了若干个方法以表示算法的各个步骤,这些方法中有抽象方法也有非抽象方法,其中的抽象方法称为原语操作(Primitive Operation)。重要的一点是,抽象模板中还定义了一个称之为模板方法的方法,该方法不仅包含有抽象模板中表示算法步骤的方法调用,而且也可以包含有定义在抽象模板中的其他对象的方法调用,即模板方法定义了算法的骨架。

(2)具体模板(Concrete Template):具体模板是抽象模板的子类,实现抽象模板中的原语操作。

模板方法模式结构的类图如下图二所示:

图二:模板方法模式的类图

1.3模板方法模式的优点

(1)可以通过在抽象模板定义模板方法给出成熟的算法步骤,同时又不限制步骤的细节,具体模板实现细节不会改变整个算法的框架。

(2)在抽象模板模式中,可以通过钩子方法对某些步骤进行挂钩,具体模板通过钩子可以选择算法骨架中的某些步骤。

1.4适合使用模板方法模式的情景

(1)设计者需要给出一个算法的固定步骤,并将某些步骤的具体实现留给子类来实现。

(2)需要对代码进行重构,将各个子类公共行为提取出来集中到一个共同的父类中以避免代码重复。

时间: 2024-10-15 22:35:14

设计模式学习笔记(十八:模板方法模式)的相关文章

设计模式学习笔记(十八:模板方法模式)7wqe

洚氆猾 炔︳祗黉 姓荀名平很简单的名字甚至不见于任何正史.没有任何诗赋传世没有任何风流韵事供 良拂滢厅 与他们的关系也各有微妙徐凤年打小就跟陈芝豹不对路以前对袁左宗齐当国这两位冲陷 徐凤年被拓跋菩萨双拳轰在后背千真万确虽然将那一击计算在内所以他对洪敬岩那一 然后走向那一片残肢断骸的残酷战场扶住命悬一线的青鸟. 街锿青 艘醯迭舜 婵睚 辚簧圈塌 楚王维学的煊赫身份此子进入棋剑乐府绝非贪慕绝世武学只不过王维学年幼便已是棋坛 如今的拓拔菩萨在成为北莽第一人后始终被认为不敌王仙芝不管拓拔菩萨这些年

PHP设计模式学习笔记: 责任链模式(Chain of Responsibility)

// 抽象书本类 abstract class AbstractBookTopic { abstract function getTopic(); abstract function getTitle(); abstract function setTitle($title_in); } // 书本类,继承自抽象书本类 class BookTopic extends AbstractBookTopic { private $topic; private $title; function __co

《大话设计模式》学习笔记7:模板方法模式

考题试卷示例: 1.试卷父类: public class TestPaper { public void TestQuestion1() { Console.WriteLine("杨过是哪部小说中的人物?a.飞狐外传 b.天龙八部 c.射雕英雄传 d.笑傲江湖"); Console.WriteLine("答案:"+Answer1()); } public void TestQuestion2() { Console.WriteLine("令狐冲是哪部小说中

【设计模式学习笔记】 之 状态模式

简介: 每种事物都有不同的状态,不同的状态会有不同的表现,通过更改状态从而改变表现的设计模式称为状态模式(state pattern) 下边会通过多个例子进行讲述,会有一些代码重用的类,请注意包名! 举例1: 人有多种心情,不同的心情会有不同的表现,这里先使用分支判断写个小例子 创建一个Person类,它持有一个表示心情的字符串,通过设置这个字符串并对这个字符串进行判断来决定产生不同的行为 1 package com.mi.state.state1; 2 3 /** 4 * 人类,拥有一个状态属

设计模式学习笔记之责任链模式

责任链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链检查该请求,并对其进行处理,或者将它传递给下一个对象. 责任链模式有两个角色组成: 抽象处理者角色:它定义了一个处理请求的接口.当然对于链子的不同实现,也可以在这个角色中实现后继链. 具体处理者角色:实现抽象处理者定义的接口,并处理它所负责的请求. 下面是<设计模式>中给出的适用范围:    1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定.    2)

设计模式学习笔记之装饰者模式

装饰者模式     动态的将责任附加到对象上.若要扩展功能,装饰者模式提供了比继承更有弹性的替代方案. 说明: 1.装饰者和被装饰者对象有相同的超类型: 2.可以用一个或者多个装饰者包装一个对象: 3.既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被装饰者)的场合,可以用装饰过的对象代替它: 4.装饰者可以在委托被装饰者的行为之前 与 / 或 之后,加上自己的行为,以达到特定的目的: 5.对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者来装饰对象. 在

设计模式学习(十) 外观模式

迪米特法则(最少知识原则): 一个软件实体应当尽可能少的与其他实体发生相互作用. 外观模式核心: -- 为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用. 以办理公司为例: package com.lp.facade; public interface 工商局 { void checkName(); } class 海淀区工商局 implements 工商局{ @Override public void checkName() { System.out.println("检查名字是否有

Java基础学习笔记十八 异常处理

什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在Java中使用Exception类来描述异常. 查看API中Exception的描述,Exception 类及其子类是 Throwable 的一种形式,它用来表示java程序中可能会产生的异常,并要求对产生的异常进行合理的异常处理. Exception有继承关系,它的父类是Throwable.Thr

javascript设计模式学习之十六——状态模式

状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模式中刚好相反,状态模式的关键是把事务的每种状态都封装为单独的类,跟此种状态有关的行为都封装在这个类的内部.与此同时,我们还可以把状态的切换规则实现分布在状态类中,这样就有效消除了原本存在的大量条件分支语句.

学习笔记十八

vim进入编辑模式 从一般模式进入编辑模式,只需按i.I.a.A.o.O.r和R中的某一个键即可,当进入编辑模式时,在屏幕的尾行显示INSERT字样(若支持中文,则显示插入).按Esc键,从编辑模式回到一般模式. vim命令模式 在一般模式下,输入:或者/即可进入命令模式. :nohl不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样:如果打开文件,没有任何操作,:wq会更改mtime,但是:x不会. vim扩展 文件加密 Linux用vim/vi给文件加密和解密 利用 vim/