赞
踩
在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。
例如:去银行办理业务一般要经过以下4个流程:区号、排队、办理具体业务、对银行工作人员进行评分等。其中取号、排队和对银行工作人员进行评分的业务是对每个客户都是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。
这样的例子在生活中还有很多,例如:一个人每天会起床、吃饭、做事、睡觉等,其中“做事”的内容每天可能不同。我们把这些规定了流程或格式的实例定义成模板,允许使用者根据自己的需求去更新它,例如:建立模板、论文模板、Word中模板文件等。
模板方法(Template Method)模式的定义如下:
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类型为模式。
模板方法模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。
下面是模板方法模式的结构:
抽象类/抽象模板(AbstractClass)
抽象模板类,负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下:
1.模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
2.基本方法:是整个算法中的一个步骤,包含以下几种类型:
1.抽象方法:在抽象类中声明,由具体子类实现。
2.具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
3.钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
具体子类/具体实现(Concrete Class)
具体实现类,实现抽象类中所定义的抽象方法和钩子方法,他们是一个顶级逻辑的一个组成步骤。
结构图如下:
abstract class AbstractClass{ public void templateMethod(){ specificMethod(); abstractMethod1(); abstractMethod2(); } public void specificMethod(){ System.out.println("抽象类中具体方法被调用!"); } public abstract void abstractMethod1(); public abstract void abstractMethod2(); } class ConcreteClass extends AbstractClass{ @Override public void abstractMethod1() { System.out.println("抽象方法1的实现被调用!"); } @Override public void abstractMethod2() { System.out.println("抽象方法2的实现被调用!"); } } public class TemplateMethodPatternSimpleTest { public static void main(String[] args){ AbstractClass template = new ConcreteClass(); template.templateMethod(); } }
例:用模板方法模式实现出国留学手续设计程序。
分析:出国留学手续一般经过以下流程:索取学校资料、提出入学申请、办理因私出国护照、出境卡和公证、申请签证、体检、订机票、准备行装、抵达目标学校等,其中有些业务对各个学校是一样的,但有些业务因学校不同而不同,所以比较适合用模板方法模式来实现。
在本实例中,我们先定义一个出国留学的抽象类StudyAbroad,里面包含了一个模板方法templateMethod(),该方法中包含了办理出国留学手续流程中的各个基本方法,其中有些方法的处理由于各国都一样,所以在抽象类中就可以实现,但有些方法的处理各国是不同的,必须要在其具体子类(如美国留学类StudyInAmerica)中实现。如果再增加一个国家,只要增加一个子类就可以了。
结构图如下:
代码样例:
abstract class StudyAbroad{ public void templateMethod(){ //索取学校资料 lookingForSchool(); //入学申请 applyForEnrol(); //申请签证 applyForPassport(); //体检、订机票、准备行装 readyGoAbroad(); //抵达 arriving(); } public void applyForPassport(){ System.out.println("三.办理因私出国护照、出境卡和公证:"); System.out.println(" 1)持录取通知书、本人户口簿或身份证" + "向户口所在地公安机关申请办理因私出国护照和出境卡。"); System.out.println(" 2)办理出生公证书、学历、学位和成功公证、" + "经历证书、亲属关系关系公证、经历担保公证。"); } public void applyForVisa(){ System.out.println("四.申请签证:"); System.out.println(" 1)准备申请国外签证所需的各种资料,包括个人学历、成绩单、工作经历的证明;" + "个人及家庭收入、资金和财产证明;家庭成员的关系证明等。"); System.out.println(" 2)向拟留学国家驻华使(领)管申请入境签证。" + "申请时需按要求填写有关表格,递交必需的证明材料,缴纳签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。