设计模式:Template Method模式

超类中定义处理流程的框架,在子类中实现具体的处理逻辑,这种就是Template Method模式

这种模式带有模板功能,组成模板的方法定义在超类中,但是都是抽象方法,具体都是在子类中实现的,但是具体处理流程是在超类中定义

比如一个案例,放任意传入的字符和字符串循环显示5次最终输出

定义的类如下:

AbstractDisplay:实现了display模板方法的抽象类

CharDisplay:实现了open,print,close方法的类

StringDisplay:实现了open,print,close方法的类

Main:测试类

首先是AbstractDisplay类,定义了display,open,print,close方法,其中open,print,close都是抽象方法,display实现了具体处理流程,调用了其它3个抽象方法

package method.template;

/**
* Copyright (C), 2014-2018, maoxiaomeng.com
* FileName: AbstractDisplay
* Author: lihui
* Date: 2018/4/30 14:23
*/

public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void display() {
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}

然后是CharDisplay类,继承了超类AbstractDisplay,重写了3个抽象方法,主要功能是将输入的字符输入5次放在<<>>中间

package method.template;

/**
* Copyright (C), 2014-2018, maoxiaomeng.com
* FileName: CharDisplay
* Author: lihui
* Date: 2018/4/30 14:25
*/

public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}

@Override
public void open() {
System.out.print("<<");
}

@Override
public void print() {
System.out.print(ch);
}

@Override
public void close() {
System.out.println(">>");
}
}

接着是StringDisplay类,继承了超类AbstractDisplay,同样重写了open,print,close,功能就是将输入的字符串以table的形式显示5次

package method.template;

/**
* Copyright (C), 2014-2018, maoxiaomeng.com
* FileName: StringDisplay
* Author: lihui
* Date: 2018/4/30 14:26
*/

public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}

private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}

@Override
public void open() {
printLine();
}

@Override
public void print() {
System.out.println("|" + string + "|");
}

@Override
public void close() {
printLine();
}
}

最后main,输入字符和字符串即可

package method.template;

/**
* Copyright (C), 2014-2018, maoxiaomeng.com
* FileName: Main
* Author: lihui
* Date: 2018/4/30 14:30
*/

public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello, LiHui~!");
d1.display();
d2.display();
}
}

 

这种模式比较直接,相关角色如下

AbstractClass(抽象类):例子中的AbstractDisplay类;负责实现模板方法,并且在模板方法中使用相关抽象方法,这些抽象方法由子类来负责实现

ConcreteClass(具体类):例子中的CharDisplay和StringDisplay类;负责实现AbstractClass角色中定义的抽象方法

Template Method模式使得流程都在超类的模板方法中完成,每个子类中不需要再来实现处理流程逻辑,因此如果有需要修改,也只修改模板方法即可;假如没有该设计模式,那么每种处理流程都需要单独一个类来完成,而这些流程基本都是类似的,假如发现有逻辑错误,每个类都要相应地进行修改

发表评论