理論
1.テンプレートモード:操作アルゴリズムでフレームワークを定義し、これらのステップをサブクラスに遅延ロードします。
テンプレートメソッドパターンを使用すると、サブクラスは、アルゴリズムの構造を変更せずに、アルゴリズムの特定のステップを再定義できます。
2.役割:
抽象テンプレートの役割:
- サブクラスがそれらを実装できるように、1つ以上の抽象操作が定義されます。これらの抽象的な操作は基本操作と呼ばれ、トップレベルロジックの構成ステップです。
- テンプレートメソッドを定義および実装しました。このテンプレートメソッドは通常、最上位ロジックのスケルトンを提供する具体的なメソッドであり、論理合成ステップは、対応する抽象操作のサブクラス実装に委ねられます。トップレベルのロジックは、特定のメソッドを呼び出すこともあります。
具体的なテンプレート(具体的なテンプレート)の役割:
- 最上位ロジックの構成ステップである、親クラスによって定義された1つ以上の抽象メソッドを実装します。
- 各抽象テンプレートロールは、それに対応する特定のテンプレートロールをいくつでも持つことができ、各特定のテンプレートロールは、これらの抽象メソッドのさまざまな実装(つまり、トップレベルロジックの構成ステップ)を提供できるため、トップレベルロジックの実現が可能になります。それぞれが異なります。
3.シーンに適しています:
- アルゴリズムの不変部分を一度に実装し、可変動作をサブクラスに任せて実装します。
- コードの重複を避けるために、各サブクラスの共通の動作を抽出して、共通の親クラスに集中させる必要があります。
- 親クラスへのサブクラスの逆制御を実現するために、親クラスのアルゴリズムのステップがサブクラスを介して実行されるかどうかを決定する必要があります。
練習
- 抽象テンプレートクラス
package com.qxy.design.template;
/**
* @author qxy
* @date 2020/10/16 2:30 下午
*/
public abstract class FileAnalysisTemplate {
//定义模版方法,对外部访问
public final void analysisFile() {
//1.验证文件后缀
validateFileSuffix();
//2.解析文件内容
analysisFileLine();
//3.验证文件标题列
validateFileTitle();
//处理钩子方法
if (specialFileColumn()) {
handlerSpecialColumn();
}
//4.封装pojo
createPojo();
//5.交互数据库
operateDataSource();
}
protected void validateFileSuffix() {
System.out.println("验证文件后缀成功:文件后缀为.xls或者.xlsx");
}
protected void analysisFileLine() {
System.out.println("文件解析成功:共用一套解析文件方法或者工具类");
}
protected abstract void validateFileTitle();
protected abstract void createPojo();
protected void operateDataSource() {
System.out.println("数据入库成功");
}
/**
* 是否特殊处理列数据
* @return false
*/
protected boolean specialFileColumn() {
return false;
}
/**
* 钩子方法:交给子类具体实现处理
*/
protected void handlerSpecialColumn() {
}
}
- 特定のテンプレートの役割:ItemAFileAnalysis
package com.qxy.design.template;
/**
* @author qxy
* @date 2020/10/16 3:08 下午
*/
public class ItemAFileAnalysis extends FileAnalysisTemplate{
@Override
protected void validateFileTitle() {
System.out.println("验证项目A的标题列是否缺失");
}
@Override
protected void createPojo() {
System.out.println("创建项目A对象");
}
@Override
protected boolean specialFileColumn() {
return true;
}
@Override
protected void handlerSpecialColumn() {
System.out.println("特殊处理:处理项目名字");
}
}
- 特定のテンプレートの役割:ItemBFileAnalysis
package com.qxy.design.template;
/**
* @author qxy
* @date 2020/10/16 3:10 下午
*/
public class ItemBFileAnalysis extends FileAnalysisTemplate{
@Override
protected void validateFileTitle() {
System.out.println("验证项目B的标题列是否缺失");
}
@Override
protected void createPojo() {
System.out.println("创建项B对象");
}
}
- クライアント
package com.qxy.design.template;
/**
* @author qxy
* @date 2020/10/16 3:07 下午
*/
public class FileClient {
public static void main(String[] args) {
FileAnalysisTemplate aFileAnalysis = new ItemAFileAnalysis();
aFileAnalysis.analysisFile();
System.out.println("-----------");
FileAnalysisTemplate bFileAnalysis = new ItemBFileAnalysis();
bFileAnalysis.analysisFile();
}
}
結果は次のとおりです。
验证文件后缀成功:文件后缀为.xls或者.xlsx
文件解析成功:共用一套解析文件方法或者工具类
验证项目A的标题列是否缺失
特殊处理:处理项目名字
创建项目A对象
数据入库成功
-----------
验证文件后缀成功:文件后缀为.xls或者.xlsx
文件解析成功:共用一套解析文件方法或者工具类
验证项目B的标题列是否缺失
创建项B对象
数据入库成功
Process finished with exit code 0
総括する
利点:
- 変更されていない部分をカプセル化し、変更されていない部分を抽出します。
- 変数部分を拡張し、変数抽象メソッドを設定して、具象サブクラスに実装させます。
- 抽出された共通コードは、後のメンテナンスに便利です。
- 動作は基本クラスによって制御され、特定の操作はサブクラスによって実装されます。
短所:
実装ごとにサブクラスが必要です。これにより、クラスの数が大幅に増加し、システムがさらに大きくなります。
特別な注意:
アルゴリズムスケルトンが悪意を持って破壊または操作されるのを防ぐために、通常、テンプレートモードを使用する場合、テンプレートメソッドはfinal
このキーワードを制限に追加します。
テンプレートパターンの鍵は、サブクラスが親クラスの可変部分を置き換えることができるが、サブクラスがテンプレートメソッドによって表される最上位のロジックを変更できないことです。
新しいサブカテゴリを定義するときは常に、制御フローの考えに従ってではなく、「責任」の考えに従って考えてください。つまり、どの操作を置き換える必要があるか、どの操作を置き換えることができるか、どの操作を置き換えることができないかを検討する必要があります。テンプレートパターンを使用すると、これらの責任を明確にすることができます。
ソースコードポータル:https://github.com/stream-source/stream-source
参考資料:Javaデザインパターン