23デザインパターン、第12章:Javaテンプレートメソッドモード
定義:操作内のアルゴリズムのフレームワークを定義し、サブクラスにいくつかのステップを遅らせるため、サブクラスはアルゴリズムの構造を変更せずにアルゴリズムの特定の特定のステップを再定義できます。
タイプ:行動パターン
クラス図:
実際、テンプレート法は、プログラミングで頻繁に使用されるパターンです。まず例を見てみましょう。ある日、プログラマーAはタスクを手に入れました。整数の配列を与え、配列の数値を小から大部分に並べ替えてから、ソートされた結果を印刷します。分析後、このタスクは、ソートと印刷の2つの部分にほぼ分割できます。印刷機能は簡単に実装できるため、ソートは少し面倒です。しかし、Aには方法があり、最初に印刷機能を完了し、ソート機能を実行する他の誰かを見つけます。
抽象クラスAbstractSort { / *** Arrayを小さいから大部分から並べ替える* @param Array* / Protected Abstract void sort(int [] array); public void shosurtresult(int [] array){this.sort(array); System.out.print( "sort result:"); for(int i = 0; i <array.length; i ++){system.out.printf( "%3s"、array [i]); }}}執筆後、卒業して仕事を始めたばかりの同僚を見つけて言った。タスクがある、私はすでに主要なロジックを書いているので、残りのロジックを実装できる。そこで、私はabstractSortクラスをBに渡し、それを実装するために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; // min値変数ind indexmin = 0; // min値インデックス変数int temp; //(int i = index; i <array.length; i ++){if(array [i] <minvalue){//最小値minvalue = array [i]; //最小値を保存indexmin = i; }} temp = array [index]; // 2つの数値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(); S.Showsortresult(a); }}実行結果:
結果をソート:0 1 3 4 5 7 9 10 12 32
それは正常に動作します。 OK、タスクが完了します。そうです、これはテンプレートメソッドパターンです。職場に入ったばかりのほとんどの卒業生は、Bと同様の経験を持つ必要があります。複雑なタスクは会社の偉大な人々によって書かれ、よりシンプルな方法を抽象化に書き、他の同僚に引き渡して開発します。この分業は、比較的明らかなレベルのプログラマーを持つ企業でよく使用されています。たとえば、プロジェクトチームに建築家、上級エンジニア、ジュニアエンジニアがいる場合、建築家は一般に、システム全体のロジックをまとめるために多数のインターフェイスと抽象クラスを使用し、実装コーディングは難易度に応じてシニアエンジニアとジュニアエンジニアに引き渡されます。それはどうですか、テンプレートメソッドモードを使用しましたか?
テンプレートメソッドパターンの構造
テンプレートメソッドパターンは、抽象クラスと継承構造を介した実装クラス(またはグループの)で構成されています。抽象クラスの方法は、3つのタイプに分割されます。
要約方法:親クラスはそれを宣言するだけですが、実装しませんが、仕様を定義し、そのサブクラスでそれらを実装します。
テンプレートメソッド:抽象クラスによって宣言および実装されています。一般的に言えば、テンプレートメソッドは抽象的なメソッドを呼び出して主な論理関数を完成させ、テンプレートメソッドは最終タイプとして定義されており、主な論理関数をサブクラスで書き直すことができないことを示しています。
フック方法:抽象クラスによって宣言および実装されています。ただし、サブクラスを拡張でき、サブクラスはフックメソッドを拡張することにより、テンプレートメソッドのロジックに影響を与える可能性があります。
抽象クラスのタスクは、抽象クラスの品質がプログラムが安定しているかどうかを直接決定するため、通常、経験豊富な人員によって書かれた論理フレームワークを構築することです。
実装クラスは、詳細を実装するために使用されます。抽象クラスのテンプレートメソッドは、クラス拡張メソッドを実装することによりビジネスロジックを完了します。実装クラスの拡張メソッドがユニットテストに合格している限り、全体的な関数には、テンプレートメソッドが正しいという前提で大きなエラーがありません。
テンプレートメソッドの利点と適用可能なシナリオ
拡張しやすい。一般的に言えば、抽象クラスのテンプレートメソッドは、逆に変更するのが容易ではない部分ですが、抽象的なメソッドは逆に変化しやすい部分です。したがって、実装クラスを追加することにより、一般的に機能を拡張するのは簡単です。これは、開閉の原則に準拠しています。
メンテナンスが簡単です。テンプレートメソッドモードの場合、それはまさにその主なロジックがテンプレートメソッドが使用されるのと同じであるためです。テンプレートメソッドが使用されていない場合、混乱の中で同じコードを維持することは非常に不便です。
より柔軟です。フック方法があるため、サブクラスの実装は、親クラスの主要なロジックの操作にも影響を与える可能性があります。ただし、サブクラスが親クラスに影響を与えるため、柔軟性がありますが、リヒターの交換原則に違反すると、プログラムにリスクがもたらされます。これにより、抽象クラスの設計により高い要件が得られます。
複数のサブクラスに同じ方法があり、メソッドが論理的に同じ場合、テンプレートメソッドパターンの使用を検討できます。このモードは、プログラムの主なフレームワークが同じで詳細が異なる場合に、プログラムの使用にも適しています。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。