戦略モード、復興のif-else

       最初のルーティングマイクロチャネルメッセージは、場合、それ以外の判断月は非常に混沌としていると思われる場合は、他の後に多くを書くために使用されたときに私達の会社は最近、公共の開発の数を完了しました。インターネットは少しシンプルなソリューションを検索し、実際に乾燥がたくさんある、私は最も単純なことの最も古典的な戦略パターンを使用することを選択した場合は、他の多くを再構築するために感じます。

まず、私たちは、新しいインターフェイスを作成します

パブリックインターフェイスInnerCommand { 
    ボイド処理(文字列MSG)。
}

   その後、各論理場合に個々に単一のクラスなどに引き込ま

/ ** 
 * @author リー。
 * @date 2019年5月24日午前15時53分
 * / 
@Service 
パブリック クラス PrintAdminCommandが実装InnerCommand { 
    @Override 
    公共 ボイド処理(文字列MSG){ 
        するSystem.out.println( "PrintAdminCommandを" )。
    } 
}

      ここではそれらをリストではありません。

      その後、我々は新しい列挙CommonCodeを作成するためにここにいます

/ ** 
 * @author リー。
 * @date 2019年5月24日午後03時51 
 * / 
パブリック 列挙CommonCode { 

    USER( "ユーザ"、 "用户"、 "com.yumstone.invoiceapply.Command.impl.PrintUserCommand" )、
    ADMIN( "管理"、「管理员」、 "com.yumstone.invoiceapply.Command.impl.PrintAdminCommand" );
    プライベート文字列のコード;
    プライベート文字列のDESC;
    プライベート文字列のclazz、
    プライベート 静的 最終地図<文字列、文字列>クラス= 新しい HashMapの<文字列、文字列> (); 

    静的{
         (CommonCode参照:CommonCode.values()){ 
            classes.put(refer.getCode()、refer.getClazz())。
        } 
    } 

     CommonCode(文字コード、文字列DESC、文字列clazz){ 
        この .CODE = コード。
        この .desc = DESC;
        この .clazz = clazz。
    } 

    パブリック 静的地図<文字列、文字列> getAllClazz(){
         戻りクラス; 
    } 
    パブリック 静的文字列getDescByCode(int型コード){
         戻りclasses.get(コード)。
    } 
    パブリックストリングにgetCode(){
         戻りコードと 
    } 
    公共 ボイドSETCODE(文字コード){
         この .CODE = コード。
    } 
    パブリック文字列getDesc(){
         戻りDESC。
    } 
    公共 ボイドsetDesc(文字列DESC){
         この .desc = DESC。
    } 
    パブリック文字列getClazz(){
         戻りclazz。
    } 
    公共 ボイドsetClazz(文字列clazz){
         この .clazz = clazz。
    } 
}

       ここでは、プログラムは、クラスの実行と、メモリにロードされ、対応するコードを開始します時にコードの静的なブロックを持つ列挙クラスを見ることができます。

      そして、我々は、クラスコードに応じて、新しい組立工程異なる処理を得ます、

/ ** 
 * @author リー。
 * @date 2019年5月24日午後03時59分
 * / 
@Component 
パブリック クラスInnerCommandContext { 
    @Autowired 
    のApplicationContextのApplicationContext。

    公共InnerCommandのgetInstance(stringコマンド){
         // getAllClazz 
        地図<文字列、文字列> allClazz = CommonCode.getAllClazz()。
        ストリングclazz = allClazz.get(コマンド)。
        InnerCommand innerCommand = nullをしてみてください{
             場合(clazz == nullの || clazz.length()== 0を){
                clazz = PrintAdminCommand。クラス.getName(); 
            } 
            innerCommand = (InnerCommand)applicationContext.getBean(Class.forNameの(clazz))。
        } キャッチ(例外e){ 
            e.printStackTrace(); 
        } 
        戻りinnerCommand。
    } 
}

       ここでは、クラスは、コンテナの中に発見春に反射することによって得られる見ることができます。さて、ここで私たちは私たちのロジックに行われ、最終的な作品を書くことができます。

/ ** 
 * @author リー。
 * @date 2019年5月24日午前16時06分
 * / 
@RestController 
パブリック クラスTextController { 
    @Autowired 
    InnerCommandContext innerCommandContext。
    @RequestMapping( "テキスト" パブリック文字列試験(@RequestParam文字列名){ 
        InnerCommand innerCommand = innerCommandContext.getInstance(名); 
        innerCommand.process(名); 
        戻る「OK」
    } 
}

       判決の多くは、今の2行のコードに最適化されているかもしれ場合、他の原稿は特に簡単ではありません

  InnerCommand = InnerCommand innerCommandContext.getInstance(名前); 
  innerCommand.process(名)
、起動時のプログラムの概要は、全ての論理メモリへのクラスのクラス名をロードし、次にコードによって構築所望の反射型によって判明最後に、必要なサービスがプロセスで実行することができ、一つは唯一の新しい論理を追加する必要が

実装クラスInnerCommandをし、群れ内の列挙クラスに追加しました。そして、あなたはこの種のコードを介して取得することができます。

 

おすすめ

転載: www.cnblogs.com/Kevinmanlee/p/11297673.html