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)

编程模式之模板方法模式(Template Method)

设计模式系列13:模板方法模式(Template Method Pattern)

Java设计模式透析之 —— 模板方法(Template Method)

JAVA SCRIPT设计模式--行为型--设计模式之Template Method模板方法(22)