您的位置:首页 > 编程语言 > Java开发

七、模板方法模式——设计模式学习笔记

2017-07-01 19:30 239 查看
作为一个编程菜鸟,过去在学习设计模式的时候,老师给推荐了一本《大话设计模式》。阅读以后受益匪浅,可惜当初没有坚持看完。
最近有时间了,又重新捡起来学习了一遍,整理了一下笔记,由于本人能力有限,欢迎大家批评指正。


1.模板方法模式 Template Method Pattern

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

模板方法是一种基于继承的代码复用技术,它是一种最简单行为型模式。在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一些列基本方法中,在抽象父类中提供一个称之位模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

我们既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。

2.uml类图



3.组成

(1)AbstractClass抽象类

作为抽象模板类,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

(2)ConcreteClass具体类

实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同

4.实例

(1)测试模板抽象类

package com.longinus.tms;
public abstract class AbstractTest {
public abstract void questionOne();
public abstract void questionTwo();

public void TemplateMethod(){
questionOne();
questionTwo();
}
}


(2)具体测试类

package com.longinus.tms;
import java.util.Scanner;
public class ConcreteTest extends AbstractTest{
private Scanner sc;
@Override
public void questionOne() {
sc = new Scanner(System.in);
System.out.println("今天中午吃什么?A。吃鸡  B。吃鱼 C.吃小龙虾 D。吃土");
System.out.println("你的答案:" + sc.nextLine());
}
@Override
public void questionTwo() {
// TODO 自动生成的方法存根
sc = new Scanner(System.in);
System.out.println("今天晚上吃什么?A。吃鸡  B。吃鱼 C.吃小龙虾 D。吃土");
System.out.println("你的答案:" + sc.nextLine());
}
}


(3)测试类

package com.longinus.tms;
public class Test {
public static void main(String[] args) {
AbstractTest at = new ConcreteTest();
at.TemplateMethod();
}
}


(4)输出结果

今天中午吃什么?A。吃鸡  B。吃鱼 C.吃小龙虾 D。吃土
D
你的答案:D
今天晚上吃什么?A。吃鸡  B。吃鱼 C.吃小龙虾 D。吃土
D
你的答案:D


3.模板方法模式特点

模板方法模式通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势,提供了一个很好的代码复用平台。

当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息