テンプレートメソッド - アドバンストアプリケーションフック(フック)

Template Methodパターンのエントリーます。https://blog.csdn.net/dengjili/article/details/79631472

デザインを変更します。

 

 


フックはオプションである、フックを追加します。

例としては、次に説明が与えられ、与えられています

パッケージheadfirst.hd.template.eg; 

パブリック 抽象 クラスAbstractClass { 

// 最終型として宣言し、この方法サブクラス上書きしない
 // テンプレートを行う親クラス定義プログラム
公共 最終 無効templateMethod(){ 
のinit(); 
privimitiveOperation1( ); // 任意の場所とすることができる
のdoSomething(); 
privimitiveOperation2(); //は、任意の位置であってもよい
;破壊()
フック(); 
} 

// ポリシーホルダーのタイプとして定義され、この方法は見えない外で
保護 ボイドフック(){
 // 余地が空の実装では、スケーラブルなサブクラス
} 

公共 ボイドをINIT(){ 
するSystem.out.printlnを(「これは、親クラスのinit初期化メソッドで多くのことを行う必要があります」); 
} 

公共 ボイド(破壊){ 
System.out.printlnはは(「これは、親クラスの初期化である方法を破壊し、N- \多くのことを行う必要があります」;)
} 

公共 のボイドのdoSomething(){ 
System.out.printlnはは( "多くを行う" ;)
} 

// データのための一般的な方法ではない多くの抽象
パブリック 抽象 無効privimitiveOperation1();
 公共の 抽象 無効privimitiveOperation2(); 
}

 

フックメソッドを書き換えることなく、サブクラス

パッケージheadfirst.hd.template.eg; 

パブリック クラス ConcreteClass 拡張AbstractClass { 

@Override 
公共 無効privimitiveOperation1(){ 
System.out.printlnはは( "ConcreteClassクラス、サブクラス1は、物事の多くを行う" ); 
} 

@Override 
公共 ボイドprivimitiveOperation2(){ 
System.out.printlnは( "ConcreteClassクラス、サブクラスのメソッド、やることがたくさん" ); 
} 

}

 

2つのサブクラス、フックメソッドのオーバーライド

パッケージheadfirst.hd.template.eg; 

パブリック クラス ConcreteClass2 拡張AbstractClassを{ 

@Override 
公共 無効privimitiveOperation1(){ 
System.out.printlnは( "クラスConcreteClass2、サブクラス1は、物事の多くを行う" ); 
} 

@Override 
公共 のボイドprivimitiveOperation2(){ 
System.out.printlnは( "クラスConcreteClass2、サブクラスのメソッド、観光名所の多くが" ); 
} 

@Overrideが
保護され 、ボイドフックを(){ 
System.out.printlnは(「カテゴリConcreteClass2は、フックメソッドの追加します追加機能" ); 
} 
}

 

テストコード

パッケージheadfirst.hd.template.eg; 

パブリック クラスのクライアント{ 

// テンプレート方法:ステップのいくつかは、サブクラス達成するために、プログラムの実行プロセスを定義し
、パブリック 静的な 無効メイン(文字列[] args)を{ 
AbstractClassのtemlate = 新しい新しいConcreteClassを(); 
temlate。 templateMethod(); 

// 第2のサブカテゴリーを置き換える、プログラム実行フロー定数 
temlate = 新しい新しいConcreteClass2(); 
temlate.templateMethod(); 
} 

}

 

テスト結果

 

 

これは、親クラスの初期化initメソッドで、我々は多くのことを行う必要があり
、ConcreteClass、サブクラス1のように多くのことを行う
多くのことを行うに
ConcreteClass、サブクラスのメソッドなどを、たくさんのない
初期の親である方法を破壊し、必要たくさんの行う

初期化initメソッドの親である、我々は多くのことを行う必要がある
ConcreteClass2、サブクラス1、たくさんのやるような
多くのことを行うに
ConcreteClass2、サブクラスのメソッド、物事の多くを行うなどを
破壊する初期の親でありますこの方法は、我々は多くのことを行う必要がある

ConcreteClass2、フック方法などを、いくつかの追加機能を追加します

 

結論サブクラスは、フック、左フックメソッドは、選択のサブクラスである、と結論しました

フックフックの他の徴候

公共 最終 ボイドtemplateMethod(){ 
INIT(); 
privimitiveOperation1(); //はどこにでもあることができる
; doSomethingの()
privimitiveOperation2(); //は、任意の位置とすることができる
破壊(); 

IF (isHook()){ 
フック()。
} 
} 

プライベート ブールisHook(){
 リターン falseに; 
} 
// ポリシーホルダー法のために定義され、この方法は、可視外ない
保護 ボイドフック(){
 // 空の実装、部屋を出ると、スケーラブルなサブクラス 
}

 


どのisHookフックメソッドである、それは括弧内のコードを呼び出すかどうかを決定することであるため、サブクラスが決定するために、このメソッドをオーバーライドすることができます

フックフックメソッドはありませんが、コードを実行するかどうかを決定することはできません

フックのJavaのペイントのJFrameフックの方法

パッケージcallback.other。

輸入javax.swing.JFrame; 

パブリック クラス TestFrameが延びたJFrame { 

プライベート 静的 最終 長いのserialVersionUID = 1Lを

公共TestFrame(){
 スーパー( "钩子フック" ); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)。
setSize( 400400 )。
setVisible(真の); 
} 
}

テスト

パッケージcallback.other。

パブリック クラスをMyFrame {
 公共 静的 ボイドメイン(文字列[]引数){
 新しいTestFrame()。
} 

}

 

テスト結果

 

フックメソッド塗料を呼び出します

パッケージcallback.other。

輸入java.awt.Graphics; 

輸入javax.swing.JFrame; 

パブリック クラス TestFrameが延びたJFrame { 

プライベート 静的 最終 長いのserialVersionUID = 1Lを

公共TestFrame(){
 スーパー( "钩子フック" ); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)。
setSize( 400400 )。
setVisible(真の); 
} 

@Override 
公共 ボイドペイント(グラフィックスG){
 スーパー.paint(G)。

g.drawString("フックオーバーライドメソッド"、180、180 ); 
} 
}

 


テスト結果

 

 

----------------
免責事項:この記事は元の記事CSDNブロガー「dengjili」であり、BY-SAの著作権契約、複製、元のソースのリンクと、この文を添付してくださいCC 4.0に従ってください。 。
オリジナルリンクします。https://blog.csdn.net/dengjili/article/details/79657157

おすすめ

転載: www.cnblogs.com/yhxb/p/11799565.html