高频设计模式:Template Method(模板方法)模式

    科技2022-07-15  147

    文章目录

    Template Method简介示例程序AbstractDisplay 类CharDisplay 类StringDisplay 类Main类运行结果

    Template Method简介

    在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为 Template Method模式。

    TemplateMethod的类图如下 其中AbstractClass是抽象类,ConcteteClass是继承该抽象类的子类。

    AbstractClass中 method1、method2、method3是抽象方法,没有具体的实现; templateMethod是使用final修饰的普通方法,具体实现调用抽象方法。

    ConcreteClass中 method1、method2、method3是对抽象类的抽象方法的重写,有具体的实现。

    Main方法 通过使用AbstractClass abstractClass = new ConcreteClass(args);,再调用abstractClass的templateMethod模板方法。

    示例程序

    此程序是一段将字符和字符串循环显示4次的简单程序。 类的一览表

    名字说明AbstractDisplay只实现了display方法的抽象类CharDisplay实现了open、print、close方法的类StringDisplay实现了open、print、close方法的类Main测试程序行为的类

    示例程序的类图 在AbstractDisplay类中定义了display方法,而且在该方法中依次调用了open、print、close这三个抽象方法。在CharDisplay和StringDisplay中有这三个抽象方法的具体实现。

    AbstractDisplay 类

    AbstractDisplay类有4个方法,分别是 display、open、print、close。其中只有 display方法实现了,open、print、close都是抽象方法。通过查看AbstractDisplay类中 display方法的代码,我们可以知道 display方法进行了以下处理。

    调用 open 方法调用四次 print 方法调用 close 方法

    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 < 4; i++) { print(); } close(); } }

    CharDisplay 类

    CharDisplay继承了抽象类AbstractDisplay,实现open、print、close方法,三个方法的处理如下表所示

    方法名处理open显示字符串 “<<”print显示构造函数接收的一个字符close显示字符串 “>>”

    这样,当 display方法被调用时,假设我们向 CharDisplay的构造函数中传递的参数是 H 这个字符,那么最终显示出来的会是如下结果。 <<HHHH>>

    CharDisplay.java

    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 类

    与CharDispaly类一样,StringDispaly类也实现了open、print、close方法,三个方法的处理如下表所示

    方法名处理open显示字符串 “+ ---- +”print在构造函数接收的字符串前后分别加上 “|” 并显示出来close显示字符串 “+ ---- +”

    此时,如果 dipslay方法被调用,假设我们向 CharDisplay的构造函数中传递的参是 “Hello World” 这个字符串,那么最终结果会像下面这样,文字会被显示在方框内部。

    +-----------+ |Hello World| |Hello World| |Hello World| |Hello World| +-----------+

    StringDisplay.java

    public class StringDisplay extends AbstractDisplay { private String str; public StringDisplay(String str) { this.str = str; } @Override public void open() { printLine(); } @Override public void print() { System.out.println("|" + str + "|"); } @Override public void close() { printLine(); } private void printLine() { int width = str.getBytes().length; System.out.print("+"); for (int i = 0; i < width; i++) { System.out.print("-"); } System.out.println("+"); } }

    Main类

    Main类的作用是测试程序行为。在该类中生成了 CharDisplay类和StringDisplay类的实例,并调用了 display方法。 Main.java

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

    运行结果

    <<HHHH>> +-----------+ |Hello World| |Hello World| |Hello World| |Hello World| +-----------+
    Processed: 0.009, SQL: 8