91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中怎么實現組合模式

發布時間:2021-07-20 10:41:26 來源:億速云 閱讀:151 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關java中怎么實現組合模式,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。


組合模式

組合模式(Composite Pattern)又叫部分整體模式,是用于把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象,用來表示部分以及整體層次。這種類型的設計模式屬于結構型模式,它創建了對象組的樹形結構。

  • 主要解決:它在我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以像處理簡單元素一樣來處理復雜元素,從而使得客戶程序與復雜元素的內部結構解耦。

  • 如何解決:樹枝和葉子實現統一接口,樹枝內部組合該接口。

  • 何時使用:

1.您想表示對象的部分-整體層次結構(樹形結構)。

2.您希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。

  • 使用場景:部分、整體場景,如樹形菜單,文件、文件夾的管理。

優點缺點
高層模塊調用簡單,節點自由增加。葉子和樹枝的聲明都是實現類,而不是接口,違反了依賴倒置原則。

java中怎么實現組合模式

文件夾-文件的樹形結構一定不陌生,文件看作葉子結點(單個對象),文件夾看作中間結點(組合對象)。

組合模式使得用戶對單個對象和組合對象的訪問具有一致性,即讓用戶以一致的方式處理個別對象以及組合對象。避免在使用過程中區分開來,造成麻煩。

java中怎么實現組合模式

  • Component :組合中的對象聲明接口,用于訪問和管理Component子部件。

  • Leaf:單個/葉子對象,葉子結點沒有子結點。

  • Composite:組合/容器對象,存儲子部件和枝節點行為,實現與子部件有關操作,如增加(add)和刪除(remove)等,list實現容器,容納Component對象。

Demo

先來看看一般的寫法:

java中怎么實現組合模式

當用戶只滿足一種折扣方案時,這種方法還能應對。

但精打細算的我們往往是同時滿足多種折扣方案,這時就可以用組合模式,把這些單個折扣方案組合容納起來,然后定義解決折扣沖突策略。實現單個對象和組合對象的統一,讓調用者使用時不必在區分。

java中怎么實現組合模式

把組合對象CompositeDiscount定義成抽象類,SingleMinStrategy和MultipleStrategy繼承它,表示解決沖突的策略,分別是取最小折扣和取折上折。

一般解決折扣沖突都是折上折,但商家往往更精明,推出互斥券之類的,即取最小折扣。也可以自定義其他折扣沖突策略。

涉及了點工廠模式和策略模式,DiscountFactory就是實例化Order類的屬性DiscountStrategy的工廠,各種折扣策略實現同一接口。

代碼:

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();
    }
}

運行結果:

java中怎么實現組合模式

java中怎么實現組合模式

以上就是java中怎么實現組合模式,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德保县| 巩义市| 都兰县| 平陆县| 南平市| 赣榆县| 桐乡市| 大厂| 缙云县| 武城县| 两当县| 东山县| 兰州市| 东乡县| 景宁| 夏邑县| 贵定县| 台北县| 班玛县| 翁牛特旗| 荔浦县| 甘谷县| 宣威市| 武胜县| 斗六市| 重庆市| 徐水县| 九台市| 清水县| 长垣县| 肥城市| 广宗县| 湛江市| 富阳市| 文化| 始兴县| 逊克县| 砚山县| 西乌珠穆沁旗| 招远市| 武宣县|