------------------------------------------行動デザインパターン
1.テンプレートモード
なぜテンプレートモデル:
スケルトンは、アルゴリズムを定義し、ステップのいくつかは、サブクラスに遅延を実現します。方法テンプレートサブクラスはアルゴリズムの構成を変更することなく、アルゴリズムにおける特定のステップを再定義具現することができるように。
利点:
- テンプレートメソッドパターン同一の符号反復に加えの親クラス、サブクラスの移動挙動;
- アルゴリズムの特定の詳細のサブクラス実装では、アルゴリズムは、拡大を支援します。
- 親がに沿って、操作を達成するためのサブクラスを呼び出して、拡張によって新しいサブクラスの振る舞いを追加「オープン - 。クローズドの原則」
短所:
-
テンプレートモードでは、親クラスの結果の実装に影響を与える結果サブクラスは、コードを読むことの難しさを増加します。
シナリオ:
- 複数のサブクラスのメソッド、および同じ論理があります。
- 重要な、複雑なアルゴリズム、コアアルゴリズムは、テンプレート法として設計することができます
実装:
テンプレートモードは、デフォルトのベースクラスのメソッドは、概念を実装してフックをフックするために低減されますが、この方法のいくつかは、サブクラスでオーバーライドされていない、あなたがそれらを得ることができる予想される場合、それらは、サブクラスでオーバーライドされるように設計されて最終的な。たとえば、
テンプレートの抽象クラス
1 パブリック 抽象 クラスHouseTemplate { 2 3 保護HouseTemplate(文字列名){ 4 本 .nameの= 名前。 5 } 6 7 保護された文字列名。 8 9 保護 抽象 ボイドbuildDoor(); 10 11 保護 抽象 ボイドbuildWindow(); 12 13 保護 抽象 ボイドbuildWall(); 14 15 保護 抽象 ボイドbuildBase(); 16 。17 、保護 抽象 ボイドbuildToilet(); 18である 19。 // フック方法 20は、 保護された ブールisBuildToilet(){ 21は 戻り trueに、 22である } 23が 24 // 共通論理 25 公衆 最終 ボイドbuildHouse(){ 26である 27 buildBase(); 28 buildWall (); 29 buildDoor(); 30 buildWindow(); 31で IF(isBuildToilet()){ 32 buildToilet()。 33 } 34 } 35 36 }
サブクラスの1
1 パブリック クラス HouseOneは延びHouseTemplate { 2 3 HouseOne(文字列名){ 4 スーパー(名); 5 } 6 7 HouseOne(文字列名、ブールisBuildToilet){ 8 本(名前); 9 この .isBuildToilet = isBuildToilet。 10 } 11 12 公共 ブールisBuildToilet。 13 14 @Override 15 保護 ボイドbuildDoor(){ 16 System.out.println(名+ "ドアの盗難防止ドア" ); 17 } 18である 19。 @Override 20れる 保護 ボイドbuildWindow(){ 21で のSystem.out.println( "ウィンドウを北向きは、"名前+ ); 22 } 23は、 24 @Override 25 保護 ボイドbuildWall(){ 26で のSystem.out.println(名+ "大理石の壁構造" ); 27 } 28 29 @Override 30 保護 ボイドbuildBase(){ 31である のSystem.out.println( +「鋼の基盤を使用して基盤を。」という名前); 32 } 33は、 34である @Override 35 保護 ボイドbuildToilet(){ 36 のSystem.out.println(名+ "南東コーナーに内蔵トイレ" ); 37 } 38である 39 @Override 40 保護 ブールisBuildToilet(){ 41である 戻りisBuildToiletを; 42 } 43であり、 44は }
サブクラス2
1つの パブリック クラス HouseTwo 延びHouseTemplate { 2 。3 HouseTwo(文字列名){ 4 スーパー(名前); 5 } 。6 。7 @Override 。8 保護 ボイドbuildDoor(){ 9 のSystem.out.println(名+ "木製ドアを使用して" ) ; 10 } 11 12である @Override 13れる 保護 ボイドbuildWindow(){ 14 のSystem.out.println(名+ "南の窓" ); 15 } 16 17。 @Override 18はされ 保護された ボイドbuildWall(){ 19 のSystem.out.println(名+ "製造されたガラス壁" ); 20である } 21である 22である @Override 23れる 保護 ボイドbuildBase(){ 24 のSystem.out.println(名+ "花崗岩の基盤の使用" ); 25 } 26である 27 @Override 28 保護 ボイドbuildToilet(){ 29 トイレの建物の北西コーナーで「するSystem.out.println(名+" ); 30 } 31は、 32 }
クライアント
1 パブリック クラスClienter { 2 3 公共 静的 ボイドメイン(文字列[]引数){ 4 HouseTemplate houseOne = 新しい HouseOne( "房子1"、偽)。 5 HouseTemplate houseTwo = 新しい HouseTwo( "房子2" )。 6 houseOne.buildHouse()。 7 houseTwo.buildHouse()。 8 } 9 10 }
それは、特注の家1トイレ(fasle)を必要としないフックメソッドをオーバーライドして見ることができ、別のは、この記事を参照してもよい:テンプレートメソッドパターン:9つのノートを学ぶのデザインモードを。