Template method模式
Posted zhichun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Template method模式相关的知识,希望对你有一定的参考价值。
Template Method模式
在父类中定义处理流程的框架,在子类中实现具体处理
在Template Method模式中有以下登场角色
- AbstractClass(抽象类)
- ConcreteClass (具体类)
AbstractClass角色不仅负责实现模版方法,
z
当使用AbstractClass abC = new ConcreteClass(“ABC”)时,再调用abC.templateMethod方法,会执行templateMetod方法中的内容,如果template方法中指定了method1, method2 和method3的实现,则会执行ConcreteClass实现的方法。
名字 | 说明 |
---|---|
AbstractDisplay | 只实现了display方法的抽象类 |
CharDisplay | 实现了open、print、 close方法的类 |
StringDisplay | 实现了open、 print、 close方法的类 |
Main | 测试程序行为的类 |
模版方法
:
调用抽象方法的display方法就是模版方法。它有两个核心要素一是在抽象类中,二是调用抽象方法
AbstractDisplay.java
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.java
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.println("<<");
}
@Override
public void print() {
System.out.println(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
StringDisplay.java
public class StringDisplay extends AbstractDisplay{
private String string;
private int width;
public StringDisplay(String string){
this.string = string;
this.width = string.length();
}
public void open(){
printLine();
}
public void print(){
System.out.println("|"+string+"|");
}
public void close(){
printLine();
}
private void printLine(){
System.out.print("+");
for (int i = 0; i < width ; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
Main.java
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
d1.display();
AbstractDisplay d2 = new StringDisplay("Hello,World");
d2.display();
AbstractDisplay d3= new StringDisplay("Hello,World");
d3.display();
}
}
运行结果
可以看到,调用父类的display模版方法后,会执行模版方法,尽管父类没有实现模版方法,但是会执行子类中已经实现的模版方法。所以可以根据子类定制具体的实现,但是父类的算法都是一致的。
总结
使用template Method的好处,
1.可以使逻辑处理通用化,由于在父类中编写了算法,因此无需在子类中编写算法。
2.父类和子类之间的协作,在 template method模式中,子类和父类紧密联系、共同工作,因此,在子类中实现父类中声明的抽象方法时,必须要理解抽象方法被调用的时机。
以上是关于Template method模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式之模板方法模式(Template Method)详解及代码示例
GOF23设计模式之模板方法模式(template method)
设计模式系列13:模板方法模式(Template Method Pattern)