Mr.Ky

23种设计模式的java实现-模板方法模式

概述

​ 模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

​ 比如定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤。

模式中的角色

抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。

具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

应用

​ 举个例子,以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。

优点

模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

子类实现算法的某些细节,有助于算法的扩展。

通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

缺点

每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

适用场景

在某些类的算法中,用了相同的方法,造成代码的重复。

控制子类扩展,子类必须遵守算法规则。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package cn.borgor.template;
/**
* Created by cyrusky on 07/03/2017.
*/
/**
* 模板类,是一个虚拟类,需要具体实现的方法虚拟化,其余相同的部分全部写死。
*/
abstract class TestPaper{
public void Q1(){
System.out.println("问题1:");
System.out.println("答案1:" + Anser1());
}
public void Q2(){
System.out.println("问题2:");
System.out.println("答案2:" + Anser2());
}
public abstract String Anser1();
public abstract String Anser2();
}
//具体实现类
class Student1 extends TestPaper{
@Override
public String Anser1() {
return "A";
}
@Override
public String Anser2() {
return "B";
}
}
//具体实现类
class Student2 extends TestPaper{
@Override
public String Anser1() {
return "C";
}
@Override
public String Anser2() {
return "D";
}
}
/**
* 客户端程序
*/
public class Template {
public static void main(String[] args){
TestPaper student1 = new Student1();
student1.Q1();
student1.Q2();
}
}
如果您觉得这片文章对您有用,请鼓励我继续创作!

热评文章