設計モードせっけいもーど:テンプレートメソッドモードもーどほうしきもーど
4510 ワード
定義#テイギ#
テンプレートメソッドモード:操作中のアルゴリズムのフレームワークを定義し、いくつかのステップをサブクラスに遅延します.サブクラスがアルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義できるようにする.
Template Method Pattern :Define the skeleton of an algorithm in a operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
メリットとデメリット
メリット:パッケージ不変部分、拡張可変部分 共通部分コードを抽出し、 のメンテナンスを容易にする.動作は親によって制御され、子は を実現する.
欠点:
一般的な設計習慣に従って、抽象クラスは最も抽象的で、最も一般的な事物属性と方法を宣言し、クラスが具体的な事物属性と方法を完成することを実現する.しかし、テンプレートメソッドモードは逆転し、抽象クラスは一部の抽象メソッドを定義し、サブクラスによって実現され、サブクラスの実行構造は親クラスの結果に影響し、つまりサブクラスは親クラスに影響を与え、コード読書の難易度を高めた.
シーンの操作複数のサブクラスには共通の方法があり、論理はほぼ同じ である.重要で複雑なアルゴリズムは、コアアルゴリズムをテンプレート方法として設計することができ、周辺の関連詳細機能は各サブクラスによって を実現する.再構成の場合、同じコードを親クラスに抽出し、フック関数によってその動作 を拘束する.
実装方法
親クラスを抽象クラスとして定義し、抽象テンプレートと呼ばれます.定義方法は、2つに分けられます.
基本メソッド:サブクラスによって実装され、テンプレートメソッドで呼び出されます.
テンプレートメソッド:1つまたはいくつか、一般的には1つの具体的なメソッド、すなわち1つのフレームワークであり、基本的なメソッドのスケジューリングを実現し、固定的な論理を完成する.
具体的な実装
抽象テンプレート
サブクラス1:親のフックメソッドを上書きし、親の実行結果を逆制御
サブクラス2:親フックメソッドを上書きし、親の実行結果を指定します.
サブクラス3:フックメソッドを上書きせず、親の実行結果を保持
シーンクラス
参考内容:
『デザインモードの禅』秦小波
テンプレートメソッドモード:操作中のアルゴリズムのフレームワークを定義し、いくつかのステップをサブクラスに遅延します.サブクラスがアルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義できるようにする.
Template Method Pattern :Define the skeleton of an algorithm in a operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
メリットとデメリット
メリット:
欠点:
一般的な設計習慣に従って、抽象クラスは最も抽象的で、最も一般的な事物属性と方法を宣言し、クラスが具体的な事物属性と方法を完成することを実現する.しかし、テンプレートメソッドモードは逆転し、抽象クラスは一部の抽象メソッドを定義し、サブクラスによって実現され、サブクラスの実行構造は親クラスの結果に影響し、つまりサブクラスは親クラスに影響を与え、コード読書の難易度を高めた.
シーンの操作
実装方法
親クラスを抽象クラスとして定義し、抽象テンプレートと呼ばれます.定義方法は、2つに分けられます.
基本メソッド:サブクラスによって実装され、テンプレートメソッドで呼び出されます.
テンプレートメソッド:1つまたはいくつか、一般的には1つの具体的なメソッド、すなわち1つのフレームワークであり、基本的なメソッドのスケジューリングを実現し、固定的な論理を完成する.
具体的な実装
抽象テンプレート
public abstract class HummerModel {
//
protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void engineBoom();
// , final , ,
final public void run() {
this.start();
this.engineBoom();
if (this.isAlarm()) {
this.alarm();
}
this.stop();
}
//
protected boolean isAlarm() {
return true;
}
}
サブクラス1:親のフックメソッドを上書きし、親の実行結果を逆制御
public class HummerH1Model extends HummerModel {
boolean alarmFlag = true;
@Override
protected void start() {
System.out.println("H1 start!");
}
@Override
protected void stop() {
System.out.println("H1 stop!");
}
@Override
protected void alarm() {
System.out.println("H1 alarm!");
}
@Override
protected void engineBoom() {
System.out.println("H1 engineBoom!");
}
@Override
protected boolean isAlarm() {
return this.alarmFlag;
}
public void setAlarm(boolean isAlarm) {
this.alarmFlag = isAlarm;
}
}
サブクラス2:親フックメソッドを上書きし、親の実行結果を指定します.
public class HummerH2Model extends HummerModel {
@Override
protected void start() {
System.out.println("H2 start!");
}
@Override
protected void stop() {
System.out.println("H2 stop!");
}
@Override
protected void alarm() {
System.out.println("H2 alarm!");
}
@Override
protected void engineBoom() {
System.out.println("H2 engineBoom!");
}
@Override
protected boolean isAlarm() {
return false;
}
}
サブクラス3:フックメソッドを上書きせず、親の実行結果を保持
public class HummerH3Model extends HummerModel {
@Override
protected void start() {
System.out.println("H3 start!");
}
@Override
protected void stop() {
System.out.println("H3 stop!");
}
@Override
protected void alarm() {
System.out.println("H3 alarm!");
}
@Override
protected void engineBoom() {
System.out.println("H3 engineBoom!");
}
}
シーンクラス
public class CLient {
public static void main(String[] args) {
HummerH1Model h1 = new HummerH1Model();
// h1.setAlarm(true);
h1.setAlarm(false);
h1.run();
HummerH2Model h2 = new HummerH2Model();
h2.run();
HummerH3Model h3 = new HummerH3Model();
h3.run();
}
}
参考内容:
『デザインモードの禅』秦小波