javaデザインモード-組み合わせモードの詳細


コンビネーションモード
コンビネーションモード(Compsite Pattern)はまた部分全体モードと呼ばれ、似たようなオブジェクトのセットを単一のオブジェクトとして扱うために使用されます。組み合わせパターンは、ツリー構造に基づいてオブジェクトを組み合わせ、部分および全体の階層を表すために使用されます。このタイプの設計モードは構造モードに属し,オブジェクト群の樹形構造を作成した。
  • は主に解決されています。私たちの樹型構造の問題では、単純な要素と複雑な要素の概念がぼやけています。クライアント・プログラムは、単純な要素を扱うように複雑な要素を処理して、クライアント・プログラムを複雑な要素の内部構造と結合させることができます。
  • はどのように解決しますか?枝と葉は統一インターフェースを実現して、枝の内部はこのインターフェースを組み合わせます。
  • いつ使いますか?
  • 1.オブジェクトの部分-全体の階層構造(ツリー構造)を表します。
    2.グループ化されたオブジェクトと個々のオブジェクトの違いを無視したい場合、ユーザーはグループ構造のすべてのオブジェクトを一括して使用します。
  • 使用シーン:部分、全体シーン、例えばツリーメニュー、ファイル、フォルダの管理。
  • 長所
    欠点
    トップモジュールの呼び出しが簡単で、ノードが自由に増加します。
    葉や枝の声明は、実のものであって、インターフェースではなく、依存逆さまの原則に反する。
    在这里插入图片描述
    フォルダ-ファイルのツリー構造は、必ずよく知られていません。ファイルは葉っぱ結点(単一のオブジェクト)と見なされ、フォルダは中間結点(組み合わせオブジェクト)と見なされます。
    組み合わせモードは、個々のオブジェクトおよびグループ化オブジェクトへのユーザのアクセスに一貫性を持たせ、すなわち、個々のオブジェクトおよびグループ化オブジェクトをユーザに一致させて処理させる。使用中に区分され、迷惑をかけることを避ける。
    在这里插入图片描述
  • Component:Componentサブコンポーネントへのアクセスと管理のためのオブジェクト宣言インターフェース。
  • Leaf:1つの葉のオブジェクトは、葉の接合点は、子の接合点がありません。
  • Compposite:グループ/コンテナオブジェクト、ストレージサブ部品と枝葉点挙動、サブ部品との関連動作を実現し、たとえば追加(add)や削除(remove)など、listはコンテナを実現し、Componentオブジェクトを収容する。
  • モモ
    まず一般的な書き方を見てみます。
    在这里插入图片描述
    ユーザーが一つの割引プランだけを満たす場合、この方法はまだ対応できます。
    しかし、綿密に計算した私たちは多くの割引プランを同時に満足させることができます。この時には、組み合わせモードを使って、これらの単一の割引方案を組み合わせて入れて、割引の衝突解決策を定義します。単一のオブジェクトと組み合わせたオブジェクトの統一を実現し、使用者が区別する必要がないようにします。
    在这里插入图片描述
    グループのオブジェクトCompsiteDisccountを抽象的なクラスとして定義し、SingleMinStrategyとMultiple Strategyを引き継ぎ、衝突を解決する戦略を示します。それぞれ最小の割引と引き出しを行います。
    普通は割引の衝突を解決するのはすべて割引の上で折るので、しかし商店はよく更に賢くて、お互いに反発する券の類を出して、つまり最小の割引を取ります。他の割引競合戦略もカスタマイズできます。
    ポイント工場モードと戦略モードに関しては、Discount Factoryとは、実質的なOrderクラスのプロパティDisccount Strategyの工場であり、各種の割引戦略が同じインターフェースを実現する。
    コード:
    
    public interface DiscountStrategy {
        public double getTotal(double price);
    }
    public class VIPDiscount implements DiscountStrategy {
        //95 
        @Override
        public double getTotal(double price) {
            return 0.95*price;
        }
    }
    public class ActivityDiscount implements DiscountStrategy{
        //9 
        @Override
        public double getTotal(double price) {
            return 0.9*price;
        }
    }
    public class StoreDiscount implements DiscountStrategy{
        // 500     6 
        @Override
        public double getTotal(double price) {
            return 500+0.6*(price-500);
        }
    }
    
    
    public abstract class CompositeDiscount implements DiscountStrategy {
        protected List<DiscountStrategy> strategies =new ArrayList(); //  
        public void add(DiscountStrategy discountStrategy){ //      
            strategies.add(discountStrategy);
        }
        @Override
        public double getTotal(double price) {
            return price;
        }
    }
    //         
    public class SingleMinStrategy extends CompositeDiscount {
        @Override
        public double getTotal(double price) {
            double rtn=price;
            for (DiscountStrategy s: strategies) {
                rtn=Math.min(rtn,s.getTotal(price));
            }
            return rtn;
        }
    }
    //        
    public class MultipleStrategy extends CompositeDiscount {
        @Override
        public double getTotal(double price) {
            double rtn = price;
            for (DiscountStrategy s : strategies) {
                rtn = s.getTotal(rtn);
            }
            return rtn;
        }
    }
    
    
    public class DiscountFactory {
        public DiscountStrategy create(String type){ //         
            //      
            if("ynn".equals(type))return new VIPDiscount();
            else if("nyn".equals(type))return new StoreDiscount();
            else if("nny".equals(type))return new ActivityDiscount();
            else{  //      
                CompositeDiscount compositeDiscount;
                System.out.println("         :1.    2.   ");
                Scanner scanner=new Scanner(System.in);
                int type2=scanner.nextInt();
                if(type2==1){
                    compositeDiscount=new MultipleStrategy();
                }
                else{
                    compositeDiscount=new SingleMinStrategy();
                }
                if(type.charAt(1)=='y')compositeDiscount.add(new StoreDiscount());
                if(type.charAt(0)=='y')compositeDiscount.add(new VIPDiscount());
                if(type.charAt(2)=='y')compositeDiscount.add(new ActivityDiscount());
                return compositeDiscount;
            }
        }
    }
    
    
    public class Order {
        public double price;
        private String type;
        public DiscountStrategy discountStrategy;
        public Order(double price) {
            this.price=price;
        }
        public void display(){
            System.out.println("  :"+price);
            System.out.println("   VIP?y/n");
            Scanner scanner=new Scanner(System.in);
            type=scanner.next();
            System.out.println("    500?y/n");
            String tmp;
            tmp=scanner.next();
            type+=tmp;
            System.out.println("       ?y/n");
            tmp=scanner.next();
            type+=tmp;
            DiscountFactory discountFactory=new DiscountFactory();
            double discountPrice=discountFactory.create(type).getTotal(price);
            System.out.println("  :"+(price-discountPrice));
            System.out.println("  :"+discountPrice);
        }
    }
    public class Client {
        public static void main(String[] args) {
            Order order=new Order(620);
            order.display();
        }
    }
    
    実行結果:
    在这里插入图片描述
    在这里插入图片描述
    このように、単一の割引であれ、多種の割引であれ、クライアントが使用する時は使い方が同じです。区別と心配は必要ありません。
    締め括りをつける
    この文章はここまでです。あなたに助けを与えたいです。私たちのもっと多い内容に注目してください。