この記事では主にデザインパターンのテンプレートメソッドパターンを紹介していますので、参考にしていただければと思います。エディターに従って見てみましょう
定義: 動作中のアルゴリズムのフレームワークを定義し、一部のステップをサブクラスに延期します。これにより、サブクラスは、アルゴリズムの構造を変更せずにアルゴリズムを再定義できます。
タイプ: 動作クラスパターン
クラス図:
実は、テンプレートメソッドはプログラミングにおいてよく使われるパターンです。まず例を見てみましょう。ある日、プログラマ A は、整数の配列を与えられて、配列内の数値を小さい値から大きい値に並べ替えて、並べ替えた結果を出力するというタスクを受け取りました。分析すると、この作業はソートと印刷の 2 つの部分に大きく分けられます。印刷機能は実装が簡単ですが、ソートは少し面倒です。しかし、A さんには、最初に印刷機能を完了させて、並べ替え機能を実行する他の人を見つける方法があります。
abstract class AbstractSort { /** * 将数组array由小到大排序 * @param array */ protected abstract void sort(int[] array); public void showSortResult(int[] array){ this.sort(array); System.out.print("排序结果:"); for (int i = 0; i < array.length; i++){ System.out.printf("%3s", array[i]); } } }
書き終えた後、A さんは最近卒業して入社したばかりの同僚 B さんを見つけてこう言いました。「タスクがあります。私はすでにメインロジックを書いています。あなたは残りの部分を実装できます。」論理。そこで、B に AbstractSort クラスを渡し、B に実装を書いてもらいました。 B はそれを引き取って見ました。完成するまでに 10 分かかりました。コードは次のとおりです。
class ConcreteSort extends AbstractSort { @Override protected void sort(int[] array){ for(int i=0; i<array.length-1; i++){ selectSort(array, i); } } private void selectSort(int[] array, int index) { int MinValue = 32767; // 最小值变量 int indexMin = 0; // 最小值索引变量 int Temp; // 暂存变量 for (int i = index; i < array.length; i++) { if (array[i] < MinValue){ // 找到最小值 MinValue = array[i]; // 储存最小值 indexMin = i; } } Temp = array[index]; // 交换两数值 array[index] = array[indexMin]; array[indexMin] = Temp; } }
書いた後、A がそれを受け取って実行しました。 :
public class Client { public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组 public static void main(String[] args){ AbstractSort s = new ConcreteSort(); sshowSortResult(a); } }
実行結果:
並べ替え結果: 0 1 3 4 5 7 9 10 12 32
は正常に実行されています。よし、ミッション完了。はい、これはテンプレート メソッド パターンです。社会に出たばかりの卒業生のほとんどは、B と同様の経験をしているはずです。複雑なタスクの場合、社内の優秀な人材がメイン ロジックを作成し、次に一見単純なメソッドを抽象的なメソッドに記述して、他の同僚に開発を任せます。この分業は、明らかなレベルのプログラミング スタッフを抱える企業でよく使用されます。たとえば、プロジェクト チームにアーキテクト、シニア エンジニア、ジュニア エンジニアがいる場合、アーキテクトは通常、多数のインターフェイスと抽象クラスを使用してシステム全体のロジックをつなぎ合わせ、実装コーディングはアーキテクトに引き継がれます。難易度に応じてシニアエンジニアとジュニアエンジニアがそれぞれ担当します。どうでしょうか、テンプレート メソッド パターンを使用したことがありますか?
テンプレートメソッドパターンの構造
テンプレートメソッドパターンは、抽象クラスと継承構造を介した1つ(または複数の)実装クラスで構成され、抽象クラス内のメソッドは3つのタイプに分けられます。 :
抽象メソッド: 親クラスは宣言するだけで実装はせず、仕様を定義し、そのサブクラスによって実装されます。
テンプレートメソッド: 抽象クラスによって宣言および実装されます。一般に、テンプレート メソッドは抽象メソッドを呼び出してメインの論理関数を完成させます。また、ほとんどのテンプレート メソッドは最終型として定義されており、サブクラスでメインの論理関数をオーバーライドできないことを示しています。
フックメソッド: 抽象クラスによって宣言および実装されます。ただし、サブクラスは拡張でき、フック メソッドを拡張することでテンプレート メソッドのロジックに影響を与えることができます。
抽象クラスのタスクは、論理フレームワークを構築することです。抽象クラスの品質はプログラムの安定性を直接決定するため、通常は経験豊富な担当者によって作成されます。
実装クラスは詳細を実装するために使用されます。抽象クラスのテンプレート メソッドは、クラス拡張メソッドを実装することでビジネス ロジックを完成させます。実装クラスの拡張メソッドが単体テストに合格し、テンプレート メソッドが正しい限り、通常、関数全体に大きなエラーは発生しません。
テンプレートメソッドの利点と適用可能なシナリオ
拡張が簡単。一般に、抽象クラスのテンプレートメソッドは遡及変更しにくい部分であり、抽象メソッドは遡及変更しやすい部分であるため、一般に実装クラスを追加することで機能拡張が容易です。 、これは開閉の原則に沿っています。
メンテナンスが簡単。テンプレート メソッド パターンの場合、主要なロジックが同じであるため、テンプレート メソッドを使用しないと、同じコードが異なるクラスに分散することになり、メンテナンスが非常に不便になります。 。
より柔軟に。フック メソッドがあるため、サブクラスの実装は親クラスのメイン ロジックの動作にも影響を与える可能性があります。ただし、柔軟性はありますが、サブクラスは親クラスに影響を与えるため、リスコフ置換原則に違反し、プログラムにリスクももたらします。これにより、抽象クラスの設計に対してより高い要件が課されます。
複数のサブクラスが同じメソッドを持ち、それらのメソッドのロジックが同じである場合は、テンプレート メソッド パターンの使用を検討できます。このモードは、プログラムの主要なフレームワークは同じだが詳細が異なる状況にも適しています。
以上がJava デザイン パターンのテンプレート メソッド パターンの紹介例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。