この記事は主にJavaデザインパターンのテンプレートメソッドパターンの関連情報を詳しく紹介していますので、興味のある方は参考にしてください
1. テンプレートメソッドパターンとは
概念。 : 一部のステップをサブクラスに延期しながら、オペレーション内のアルゴリズムのスケルトンを定義します。テンプレート メソッドを使用すると、アルゴリズムの構造を変更せずに、サブクラスでアルゴリズムの特定のステップを再定義できます。
平たく言えば、テンプレート メソッド パターンは、変更されていない動作をスーパークラスに移動し、サブクラス内の重複したコードを削除することでその利点を実現し、優れたコード再利用プラットフォームを提供します。サブクラス内に不変メソッドと可変メソッドが混在している場合、サブクラス内で不変メソッドが複数回出現するため、1 つのメソッドを変更する必要がある場合、多くのメソッドを変更する必要があるという問題がありますが、これは最初に検討する必要があります。デザインの始まり。このとき、テンプレート メソッド パターンが機能します。テンプレート メソッド パターンを通じて、これらの繰り返しメソッドが 1 つの場所に移動され、サブクラスが繰り返しのもつれを取り除くのに役立ちます。
わかりやすい例を挙げると、私が子どものころ、著者の家は貧しかったのですが、田舎の小学校に通っていたとき、学校にはテスト用紙がなかったので、生徒は全員手書きでした。その時に印刷された試験用紙。クラスには 50 人以上の生徒がいて、各生徒は黒板に書かれたテスト用紙を繰り返し写さなければなりませんでしたが、私のような近視の人間は、8 が 3 になったり、7 が 1 になったりすることがありました。正解はできましたが、点数があまり高くなく、いつもクラスで最下位でした。これは重複と不変性という非常に深刻な問題ですが、現在では学生がテスト用紙をコピーする必要がなくなり、テスト用紙を繰り返しコピーするという問題が解決されました。テンプレートのメソッドも同様です。
2. モードの比較
1. テスト用紙コピーモード
繰り返しによる不便さを説明するために、著者はテスト用紙コピーモードという名前を使用しています。
生徒 A がコピーしたテスト用紙
public class TestPaperA { //试卷第一题 public void testQuestion1(){ System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈"); System.out.println("答案:C"); } //试卷第二题 public void testQuestion2(){ System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛"); System.out.println("答案:C"); } //试卷第三题 public void testQuestion3(){ System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴"); System.out.println("答案:B"); } }
生徒 B がコピーしたテスト用紙
public class TestPaperB { //试卷第一题 public void testQuestion1(){ System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈"); System.out.println("答案:A"); } //试卷第二题 public void testQuestion2(){ System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛"); System.out.println("答案:C"); } //试卷第三题 public void testQuestion3(){ System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴"); System.out.println("答案:D"); } }
クライアント コード
public class ShowAnswer { public static void main(String[] args) { System.out.println("学生甲的试卷"); TestPaperA stuA = new TestPaperA(); stuA.testQuestion1(); stuA.testQuestion2(); stuA.testQuestion3(); System.out.println("学生乙的试卷"); TestPaperB stuB = new TestPaperB(); stuB.testQuestion1(); stuB.testQuestion2(); stuB.testQuestion3(); } }
上記の 2 人の生徒がコピーしたテスト用紙には、次のような重複があることが簡単にわかります。テスト用紙の質問と解答の出力方法が各生徒のテスト用紙のカテゴリに混在しているため、メンテナンスや閲覧に役立ちません。テンプレートのメソッド パターンがどのように改善されているかを見てみましょう。
2. テンプレートメソッドモード
各生徒のテスト用紙、質問、回答などの繰り返し部分を抽出します。
まずテスト用紙クラスを変換し、それを抽象クラスに変更します。このクラスでは、生徒全員が回答する必要がありますが、回答は異なるため、回答プロセスは次のとおりです。繰り返し変更されないメソッドとして抽出され、コードは次のとおりです。
public abstract class TestPaper { //试卷第一题 public void testQuestion1(){ System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈"); System.out.println("答案:" + answer1()); } //试卷第二题 public void testQuestion2(){ System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛"); System.out.println("答案:" + answer2()); } //试卷第三题 public void testQuestion3(){ System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴"); System.out.println("答案:" + answer3()); } //这三个钩子方法是给每个子类去实现,并返回答案的 public abstract String answer1(); public abstract String answer2(); public abstract String answer3(); //模板方法,考试的过程,定义基本的考试过程,子类回调 public void exam(){ testQuestion1(); testQuestion2(); testQuestion3(); } }
まず最初の生徒のテスト状況を見てみましょう
public class TestPaperA extends TestPaper{ @Override public String answer1() { return "A"; } @Override public String answer2() { return "B"; } @Override public String answer3() { return "D"; } }
他の生徒のテスト用紙の答えは異なる可能性がありますが、基本的な解答プロセスは同じなので繰り返しません。クライアントコードを見てみましょう。下に。
public class ShowAnswer { public static void main(String[] args) { TestPaper testPaper = new TestPaperA(); testPaper.exam(); } }
これにより、ロジックが明確になり、保守が容易になっていることがわかります。具体的な答えを見てみましょう。
小龍奴は楊過の親戚ですか? () A. 小叔母 B. 大叔母 C. 叔母 D. 叔母
答え: A
泉鎮宗の初代宗主は誰ですか? A.周伯通 B.欧陽峰 C.王重陽 D.西門自慢
答え:B
『ドラゴン』で南校の王と称された英雄は誰でしょう? A. Duan Yu B. Qiao Feng C. Mouron Fu D. Duan Zhixing
答え: D
3. テンプレートメソッドパターンの基本構造
AbstractClass は抽象クラスであり、実際には抽象テンプレートです。テンプレートメソッドを定義および実装します。このテンプレート メソッドは通常、論理的な骨格を与える具体的な実装であり、論理構成は対応する抽象クラス内にあり、サブクラスの実装に延期されます。コードは次のとおりです
public abstract class AbstractClass { //一些抽象行为,可以理解为重复不变的方法,提取到抽象类 public abstract void primitiveOperation1(); public abstract void primitiveOperation2(); //模板方法,给出了具体逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现 public void templateMothed(){ primitiveOperation1(); primitiveOperation2(); } }
ConcreteClass。親クラスによって定義された 1 つ以上の抽象メソッドを実装します。各 AbstractClass は、それに対応する 1 つ以上の ConcreteClass を持つことができ、各 ConcreteClass はこれらの抽象メソッドの異なる実装 (つまり、スケルトンのステップ) を提供できるため、取得される実装は異なります。
public class ConcreteClassA extends AbstractClass{ @Override public void primitiveOperation1() { System.out.println("子类A的操作1"); } @Override public void primitiveOperation2() { System.out.println("子类A的操作2"); } }
public class ConcreteClassB extends AbstractClass{ @Override public void primitiveOperation1() { System.out.println("子类B的操作1"); } @Override public void primitiveOperation2() { System.out.println("子类B的操作2"); } }
上記では 2 つの特定の実装が定義されていますが、実際にはその他の実装も同じなので、ここでは詳しく説明しません。クライアントコードを見てみましょう
public class Show { public static void main(String[] args) { AbstractClass c; c = new ConcreteClassA(); c.templateMothed(); c = new ConcreteClassB(); c.templateMothed(); } }
以下を入力してください
サブクラスAの操作1
サブクラスAの操作2
サブクラスBの操作1
サブクラスBの操作2
UML図
4.
3. まとめ
テンプレートメソッドのパターンは、繰り返し変更されていないコードを抽象クラスに抽出します。特定の詳細レベルで一貫したプロセスまたは一連のステップを完了したいが、より詳細なレベルでの個々のステップの実装が異なる可能性がある場合、通常、それに対処するためにテンプレート メソッド パターンの使用を検討します。
以上がJavaデザインパターンのテンプレートメソッドパターンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。