您的位置:首页 > 其它

Chapter 9 模板方法模式

2017-02-06 16:16 148 查看


1 概述

模板方法(Template Method)模式是关于类的行为模式。在一个抽象类中定义一个算法的骨架,其中一些步骤和逻辑已经实现,而将另外一部分步骤和逻辑推迟到子类中去实现。模板方法模式使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤。模板方法模式让不同的子类可以用不同的方式实现抽象的方法,从而让算法有不同的实现。


2 实现方式


2.1 重要的概念

在具体实现上,模板方法模式主要包括了以下两个类:

(1) 抽象类:定义了一系列的基本操作,这些操作一部分是具体的,另外一部分是抽象的,每个基本操作对应算法的一个步骤。另外,在抽象类中实现了一个模板方法,用于定义算法的框架,在该框架中不仅可以调用抽象类中实现的基本方法,也可以调用该类的子类实现的方法,还可以调用其他对象的方法

(2) 具体子类:抽象类的子类,实现了抽象父类中的抽象方法,以完成该子类特定算法的步骤,也可以覆盖在父类中已经实现的具体操作

在模板方法模式中,还有两个重要的概念,即基本方法和模板方法:

(1) 基本方法:定义了算法的每个步骤,其具体实现既可以在抽象父类中,也可以在具体子类中

(2) 模板方法:在抽象类中定义了算法的框架,其是基本方法的组合,一般会被final修饰,表示其被具体子类修饰后不可以被重写。模板方法也是模板方法模式名字的由来


2.2 具体案例

为了更好的理解模板方法模式,这里以现实生活中常见的去医院看病的过程为例,对模板方法模式进行具体的阐述

首先定义一个抽象父类,描述了去医院看病的大致过程,其中,execute方法为上文提到的模板方法,定义了到医院看病的基本流程,包括:1、排队取号;2、具体的诊断过程;3、诊断结束,按照医生的处方拿药。其中第一步和第三步基本上都是相同的,因此在抽象父类中实现,而第二步根据病情的不同会有很大的不同,因此是抽象的,留到具体子类中去实现

abstract class SicknessDiagnoseHandler {

public final void execute() {
queueForSeqNum();
diagnose();
pickUpMedicine();
}

private void queueForSeqNum() {
System.out.println("正在排队挂号......");
System.out.println("排到第" + new Random().nextInt(100) + "号");
}

public abstract void diagnose();

private void pickUpMedicine() {
System.out.println("按照医生的处方去药房拿药......");
}
}
有了抽象父类,需要定义继承该抽象的具体子类,该子类中要复写第二步,即上面的diagnose方法。例如,描述一个看胃病的子类,在该子类的diagnose方法中,描述了诊断的具体过程,即做胃镜检查

class StomachacheDiagnoseHandler extends SicknessDiagnoseHandler {

@Override
public void diagnose() {
System.out.println("胃镜检测......");
}
}
再比如,描述一个诊断骨折的子类,在该子类的diagnose方法中,描述了拍X光片检查的诊断过程
class BonefractureDiagnoseHandler extends SicknessDiagnoseHandler {

@Override
public void diagnose() {
System.out.println("拍X光片......");
}
}
有了上面两个类,编写客户端的测试程序就变得十分容易了
public class TemplateMethodDemo {
public static void main(String[] args) {
SicknessDiagnoseHandler handler1 = new StomachacheDiagnoseHandler();
handler1.execute();
SicknessDiagnoseHandler handler2 = new BonefractureDiagnoseHandler();
handler2.execute();
}
}



2.3 UML类图

模板方法模式的UML类图描述比较简单,只涉及到了简单的继承关系




3 总结

模板方法模式是一种常见的设计模式,它是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。其主要针对这样一种场景:当需要完成某件事的时候,其步骤是固定的,但是每个步骤的具体实现方式不一定。这时,我们可以将所有的操作抽象到一个抽象类中,并且将固定的步骤定义在模板方法中,而具体的操作可以分成两类,一类是实现方法比较固定的操作,这类操作在抽象类中实现,而另外一类是不固定的操作,这类操作被abstract修饰,表明其需要在子类中具体实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: