設計モード学習ログ-ポリシーモード


設計モード学習ログ-ポリシーモード
  • ポリシーモード
  • 実装形態
  • ケース:支払インタフェース
  • 長所と短所分析
  • ポリシー・モード
    「大話設計モデル」という本では、戦略モデルについてこのように説明しています.戦略モデルはアルゴリズムファミリーを定義し、それぞれカプセル化し、彼らの間で互いに置き換えることができます.このモデルはアルゴリズムの変化を、アルゴリズムを使用する顧客に影響を与えません.このように見ると少し複雑かもしれませんが、javaで実際に使用した後、私は設計モードの理解について、ある機能インタフェースに対する多くの実装案と呼び出しを簡単に要約することができます.
    インプリメンテーションモード
    概念は終わって、次に実現して、実は策略のモードの実現の方式はとても簡単で、上で概括したように、まず1つのインターフェースを書いて、それから実際の情況によってこのインターフェースに対して実現して、どれだけの情況があって、どれだけの実現のクラスを書いて、次にこれらの実現のクラスのために1つの策略のコンテキストを創立して、つまり、クラスを定義する前に実装されたクラスの呼び出しルールを書き、最後にクライアントが必要とするときに呼び出せばいいのです.
    ケース:支払いインタフェース
    私がデザインモデルの本で見たデパートの例に比べて、私は支払いインタフェースをケースとして使うのが好きです.これは私が最近プロジェクトで実用的になったので、デザインモデルを体現する最も直感的なケースです.
    //    
    public  interface PayStrategy{
        public void pay(PayContext context);
    }
    //       
    public class AliPay implements PayStrategy{
        @Override
        public void pay(PayContext context){
            System.out.println(context.getName()+"       "+context.getMoney()+" ")
        }
    }
    //      
    public class WxPay implements PayStrategy{
        @Override
        public void pay(PayContext context){
            System.out.println(context.getName()+"      "+context.getMoney()+" ")
        }
    }
    //     
    @Data
    public class User{
        private String name;
        private String money;
    }
    //        
    public class PayContext{
        private String name;
        private String money;
        private PayStrategy payStrategy;
        
        public PayContext (User user,PayStrategy payStrategy ){
            this.name=user.getName();
            this.money=user.getMoney();
            this.payStrategy=payStrategy;
        }
        
        public String getName(){
            return this.name;
        }
        
        public String getMoney(){
            return this,money;
        }
        
        
        public void pay(){
            return pay(this);
        }
    }
    
    
    //    
    public class client{
        public static void main(String args[]){
            PayStrategy ali=new Alipay();
            PayStrategy wx=new WxPay();
            User ali=new User();
            ali.setName("Steve");
            ali.setMoney("4000");
            
            User wx=new User();
            wx.setName("Jobs");
            wx.setMoney("400");
            
            
            PayContext use1=new PayContext (ali,Ali);
            PayContext use2=new PayContext (wx,Wx);
            use1.pay();
            use2.pay();
        }
    }//    
    public  interface PayStrategy{
        public void pay(PayContext context);
    }
    //       
    public class AliPay implements PayStrategy{
        @Override
        public void pay(PayContext context){
            System.out.println(context.getName()+"       "+context.getMoney()+" ")
        }
    }
    //      
    public class WxPay implements PayStrategy{
        @Override
        public void pay(PayContext context){
            System.out.println(context.getName()+"      "+context.getMoney()+" ")
        }
    }
    //     
    @Data
    public class User{
        private String name;
        private String money;
    }
    //        
    public class PayContext{
        private String name;
        private String money;
        private PayStrategy payStrategy;
        
        public PayContext (User user,PayStrategy payStrategy ){
            this.name=user.getName();
            this.money=user.getMoney();
            this.payStrategy=payStrategy;
        }
        
        public String getName(){
            return this.name;
        }
        
        public String getMoney(){
            return this,money;
        }
        
        
        public void pay(){
            return pay(this);
        }
    }
    
    
    //    
    public class client{
        public static void main(String args[]){
            PayStrategy ali=new Alipay();
            PayStrategy wx=new WxPay();
            
            User aliuser=new User();
            aliuser.setName("Steve");
            aliuser.setMoney("4000");
            
            User wxuser=new User();
            wxuser.setName("Jobs");
            wxuser.setMoney("400");
            
            
            PayContext use1=new PayContext (aliuser,Ali);
            PayContext use2=new PayContext (wxuser,Wx);
            use1.pay();
            use2.pay();
        }
    }
    

    メリットとデメリットの分析
    利点:if-elseの使用によるコード結合性を低減し、コードメンテナンスが向上したコードの拡張性に有利であり、if-elseに比べて、ポリシーモードを使用して後続の機能の追加はインタフェースを実現するだけでよい.
    欠点:contextはポリシークラスを使用する時、ポリシーインタフェースを実現したため、一部の使えないデータは依然としてポリシークラスを初期化されすぎて、すべてのポリシーはすべて1つのクラスで、多重性が高くなくてすべてのポリシークラスはすべて対外的に暴露する必要があります、つまりクライアントはすべてのポリシークラスを知る必要があります
  • Javaの1つの言語だけに接触したことがあるため、ポリシーモードに接触したときにポリシーモードの実現はjavaの多態性に基づいていると無意識に思っていたが、実際には、多態をサポートしない言語の多くは依然としてポリシーモードを使用することができ、javaの多態性はポリシーモードの実現に便利さを提供しただけである