パッケージcom.demo.model.template、 輸入はjava.util.ArrayListの; インポートはjava.util.List; インポートjava.util.function.Consumer; // / ** *テンプレートの戦闘シミュレーションモードプロキシモード+ * *メリット *パッケージ可変部分に延長不変部分は、ちょうどアドバイス実装、追加するinit()メソッドの実装クラスを追加し、任意に拡大するステップを指定することができる * * * / パブリック クラスTemplateTest { / ** *春に初期化することができます呼び出した後 * @PostConstructアノテーションは、この問題を解決することができます * / パブリック 静的が 無効のinit(){ AdviceProxy.add(新しい新しいAdvice01Implを()); AdviceProxy.add(新新Advice02Impl()); } 公共の 静的な 無効メイン(文字列[]引数){ //は初期ばね後に呼び出すことができる // @PostConstructアノテーションは、この問題を解決することができる (INIT)を、 AbstractTemplateテンプレート = 新しい新しいAdviceProxy(); // - -------------コールフローテンプレート template.templateMethod(); } } / ** *テンプレート抽象クラス * / 抽象 クラスAbstractTemplate { ボイドtemplateMethod(){ abstractMethod1(); specificMethod()。 abstractMethod2(); } //パッケージ不変部分 プライベート 無効specificMethod(){ System.out.printlnは( "一定のロジック実行" ); } // 延長可変部分 抽象 無効abstractMethod1(); 抽象 無効abstractMethod2(); } / ** *エージェント結合抽象テンプレートクラス+サブクラス *機能 * * * / クラスを AdviceProxy 拡張AbstractTemplate { // アドバイスを達成するためにすべてのサブクラスを プライベート 静的リスト<アドバイス> = adviceList 新しい新しいのArrayListを(); / ** *プロキシオブジェクトの参照を追加します。 * @paramアドバイス * / パブリック 静的な 無効の追加(アドバイスをアドバイス){ adviceList.add(アドバイス); } / ** *抽象クラススケーラブルなテンプレートメソッド * / @Override 無効abstractMethod1(){ // すべての実装のアドバイスを実行するために開始されます( )メソッド のSystem.out.println(「実行するために...プロキシ方式」); // paramは:呼び出しは上記の(実行される)forループ:匿名実現コンシューマー・インタフェースの実装コールは(開始)法、電子入ってくる(consumer.accept(アドバイス);)とき 実行(E-> {e.begin();}); } / ** *メソッドスケーラブルなテンプレート抽象クラス * / @Override 無効abstractMethod2(){ //アドバイスは、すべての実装後()メソッドを実行する のSystem.out.println( "方法2エージェントは...実行" ;) 実行(E - > {e.after();}); } / ** * *関数式をプログラミングコンシューマアプリケーション *役割: *すべての実装クラス循環アドバイスインターフェイスメソッドは、未実現呼び出します。このメソッドは再び達成法と呼ばれたとき、パラメータとして、)(現在の実装クラスを受け入れ、()関数型プログラミング統一使用を受け入れます * @ param 消費者 * / プライベート 無効実行(消費者<アドバイス> 消費者){ のために(アドバイスアドバイス:adviceList){ consumer.accept(アドバイス); } } } / ** *抽象通知 * / インターフェースアドバイス{ / ** *事前通知 * / 無効(開始); / ** *リア通知 * / ボイド(後); } / ** *通知01を具現 スプリング@Bean Springのアノテーションによってホストされてもよいです* / * クラス Advice01Impl 実装情報{ @Override 公共 ボイド開始(){ System.out.printlnは(「ビジネス・ステップ2:事前通知01が実行する具体...」); } @Override 公共 ボイド(後){ のSystem.out .println( "ビジネスは最後のステップの手順:アドバイス01実行後に実現を..." ); } } / ** *通知特定の実装02 *春の春に@Beanノートが主催することができます * / クラス Advice02Impl 実装アドバイス{ @Override 公共 のボイド開始(){ System.out.printlnは(「ビジネスステップ2:02の事前通知の具体的な実現の実装...」) ; } @Override 公共 のボイド(){の後 のSystem.out.println( "ビジネスステップ最後のステップ:循環具現化後の02 ..." ); } }