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