使用Java实现Template Method模式

首先

我将总结我阅读的《增补改订版 Java语言学习设计模式入门》,该书介绍了GoF的设计模式。

模板方法模式

TemplateMethod是一种设计模式

在 TemplateMethod 模式中,我们通过在超类中定义处理的骨架,然后在子类中定义具体的实现来实现。其中,在超类中定义处理的骨架的方法被称为 TemplateMethod。

角色亮相

image.png

抽象类

AbstractClass
テンプレートメソッドを実装するクラスです。
テンプレートメソッド内で呼び出すメソッドについても宣言を行いますが、実装についてはサブクラスのConcreateClassで行います。
そのため、テンプレートメソッド以外のメソッドは抽象メソッドとなります。

实现类

ConcreateClass
テンプレートメソッド内で呼び出されている抽象メソッドを実装するクラスです。
ここで実装したメソッドがスーパークラスであるAbstractClassから呼び出されます。

具體例子

作为具体例,我将以“操作手册”、“A操作手册”和“B操作手册”来进行解释。

抽象类

AbstractManualクラス
AbstractManual(手順書)クラスは抽象クラスで、作業手順の骨組みを実装します。
ここではoperation()メソッドが作業手順の骨組みを実装しているメソッド(templateMethod)になります。
その他のstart()メソッド、work()メソッド、end()メソッドに関しては宣言を行い、operation()メソッド内で呼び出しを行なっていますが、実装は行なっておらず、具体的な処理についてはサブクラスのOperationAManual.classとOperationBManual.classで定義します。

package templateMethod;

public abstract class AbstractManual{
    public abstract void start();

    public abstract void work();

    public abstract void end();

    public final void operation() {
        start();
        for (int i = 0; i < 3; i++) {
            work();
        }
        end();
    }
}

实现类

OperationAManualクラス
抽象メソッドのstart()、work()、end()を実装しています。
コンストラクタで文字を受け取りwork()メソッドで出力を行っています。

package templateMethod;

public class OperationAManual extends AbstractManual {
    private char ch;

    public OperationAManual(char ch) {
        this.ch = ch;
    }

    @Override
    public void start() {
        System.out.println("<<作業A開始>>");
    }

    @Override
    public void work() {
        System.out.println(ch + "を処理しています");
    }

    @Override
    public void end() {
        System.out.println("<<作業A終了>>");
    }
}

OperationBManualクラス
OperationAManual.classと同様に抽象メソッドのstart()、work()、end()を実装していますが、実装の内容については異なっています。
コンストラクタで文字列を受け取り、work()メソッドで出力を行っています。

package templateMethod;

public class OperationBManual extends AbstractManual {
    private String string;

    public OperationBManual(String string) {
        this.string = string;
    }

    @Override
    public void start() {
        System.out.println("**作業B開始**");
    }

    @Override
    public void work() {
        System.out.println(string + "を処理しています");
    }

    @Override
    public void end() {
        System.out.println("**作業B終了**");
    }
}

执行类

Mainクラス
OperationAManualとOperationBManualのインスタンスを生成し、TemplateMethodのoperation()を呼び出しています。

package templateMethod;

public class Main {
    public static void main(String[] args) {
        AbstractManual d1 = new OperationAManual('F');
        AbstractManual d2 = new OperationBManual("HelloWorld");
        d1.operation();
        d2.operation();
    }
}

结果

执行Main.java的结果如下所示。
可以确认调用了相同的operation(),但输出结果不同。

<<作業A開始>>
Fを処理しています
Fを処理しています
Fを処理しています
<<作業A終了>>
**作業B開始**
HelloWorldを処理しています
HelloWorldを処理しています
HelloWorldを処理しています
**作業B終了**

优点

通过使用TemplateMethod模式,可以将处理的框架通用化。
这样一来,多个工作者可以各自基于处理的框架进行创建,防止了应该统一的部分没有统一的情况。

总结

我学习了关于规定处理框架的Template Method模式。如果方便的话,请参考以下示例代码。

    TemplateMethodサンプルコード

此外,关于其他设计模式,下面也总结了一些,请参考。

    [随時更新]Javaでデザインパターンまとめ

引用文献

    増補改訂版 Java言語で学ぶデザインパターン入門
广告
将在 10 秒后关闭
bannerAds