ツール記事-Javaデザインパターンの蓄積(B)

 ------------------------------------------行動デザインパターン

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つのノートを学ぶのデザインモードを

 

おすすめ

転載: www.cnblogs.com/lcmichelle/p/11118551.html