版权声明:Copyright©TJU YanMing https://blog.csdn.net/tjuyanming/article/details/84400495
Template Method
顾名思义,就是说父类在其内部定义了一些抽象函数,然后定义了一个模板方法,并在模板方法中调用了这些抽象方法。父类在模板方法中定义了某个功能处理流程的框架,而子类则实现具体的处理。这个例子非常简单,其核心的理念就是使逻辑处理通用化。
我们通过书中的一个简单的例子来看一下Template Method
的具体实现方法:
首先,我们定义一个父类AbstarctDisplay.java
public abstract class AbstractDisplay {
abstract void open();
abstract void print();
abstract void close();
public final void display(){
open();
for (int i = 0 ; i < 5 ; i++){
print();
}
close();
}
}
其中,我们可以看出,该父类中定义了三个抽象函数,表示具体的功能细节在其子类中完成。并且定义了一个final
的具体函数,表示在display()
函数中,定义具体的流程。这样的一个函数就称为Template Method
.
其子类的实现以及调用如下所示:
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
void open() {
System.out.print("<<");
}
@Override
void print() {
System.out.print(ch);
}
@Override
void close() {
System.out.println(">>");
}
}
public class StringDisplay extends AbstractDisplay {
private String str;
public StringDisplay(String str) {
this.str = str;
}
@Override
void open() {
printTable();
}
@Override
void print() {
System.out.println("|" + this.str + "|");
}
@Override
void close() {
printTable();
}
void printTable(){
System.out.print("+");
for(int i = 0 ; i < this.str.length();i++){
System.out.print("-");
}
System.out.println("+");
}
}
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("你好,世界!");
AbstractDisplay d3 = new StringDisplay("Hello,World!");
d1.display();
d2.display();
d3.display();
}
}
输出结果如下(由于含有中文以及Markdown显示问题,表头和底部的线没有完全覆盖文字):
<>
±-----+
|你好,世界!|
|你好,世界!|
|你好,世界!|
|你好,世界!|
|你好,世界!|
±-----+
±-----------+
|Hello,World!|
|Hello,World!|
|Hello,World!|
|Hello,World!|
|Hello,World!|
±-----------+
Template Method
设计模式实现十分的简单,其核心内容就是在父类中实现一个具体的模板方法和一些抽象的方法,模板方法定义了具体的功能流程,而抽象方法需要在子类中进行实现 ,其具体的UML图
在这里就不赘述了。