设计模式之:模版方法

二话不多说直接上代码

1、先定义一个抽象类(父类)

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();
    }
}

父类负责把方法之间的调用进行组合,把具体的事情交给子类去实现,父类相当于一个统管调用的角色

2、定义一个「字符串」组装类(子类)

public class StringDisplay extends AbstractDisplay {

    private String message;
    private int width;
    public StringDisplay(String message) {
        this.message = message;
        this.width = message.getBytes().length;
    }
    @Override
    public void open() {
        printLine();
    }

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

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

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

子类继承父类,去实现父类中未实现的抽象方法

3、定义一个「字符」组装类(子类)

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(">>");
    }
}

第二个子类,方便对比出效果,都是组转字符输出到控制台,实际业务中需要方法传参进行业务逻辑处理

4、Main方法测试

public class Main {

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

<<HHHHH>>
+------------+
|Hello World.|
|Hello World.|
|Hello World.|
|Hello World.|
|Hello World.|
+------------+

5、总结

在 Template Method 模式中,处理的流程被定义在父类中,而具体的处理则交给了子类。但是对于“如何划分处理的级别,哪些处理需要由父类完成,哪些处理需要交给子类负责”并没有定式,这些都需要由负责程序设计的开发人员来决定。