テンプレートの戦闘シミュレーションモード+プロキシモード

パッケージ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 ..." ); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/shianliang/p/11585896.html