Template method模式

試著忘記壹切 提交于 2020-02-11 01:26:39

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模式中,子类和父类紧密联系、共同工作,因此,在子类中实现父类中声明的抽象方法时,必须要理解抽象方法被调用的时机。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!