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

溫馨提示×

溫馨提示×

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

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

java中的裝飾者模式是什么

發布時間:2021-07-21 10:49:30 來源:億速云 閱讀:160 作者:chen 欄目:開發技術

本篇內容介紹了“java中的裝飾者模式是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

目錄
  • 引例

  • 一般解法

  • 裝飾者模式

  • 裝飾者解法

    • 代碼:

      • 抽象類

      • 裝飾者

      • 被裝飾者

      • 客戶端測試

  • 總結:

    引例

    需求:設現在有單品咖啡:Espresso(意大利濃咖啡)和LongBlack(美式咖啡),調料有Milk(牛奶)和sugar(糖),客戶可以點單品咖啡或單品咖啡+調料的組合,計算相應費用。要求在擴展新的咖啡種類時,具有良好的擴展性、改動維護方便。

    拋磚引玉,我們先看看兩種一般解法。

    一般解法

    方案一、

    枚舉創建每一種組合可能,Drink抽象類表示飲料,cost()方法計算價格,子類如Longblack_Milk表示美式咖啡加牛奶:

    java中的裝飾者模式是什么

    這樣設計十分不明智,會有很多類,當新增一個單品咖啡或調料時,類的數量就會倍增,出現類爆炸。

    方案二、

    把調料內置到Drink類,減少類數量過多:

    java中的裝飾者模式是什么

    方案二雖然不至于造成很多類,但是增加或刪除調料時,代碼維護量仍舊很大。

    裝飾者模式

    裝飾者模式(Decorator Pattern)是結構型模式,也稱裝飾器模式/修飾模式。它可以動態的將新功能附加到對象上,同時又不改變其結構。在對象功能擴展方面,它比繼承更有彈性。這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。

    類圖:

    java中的裝飾者模式是什么

    1. Component抽象類:主體,比如類似前面的Drink。

    2. ConcreteComponent類:具體的主體,比如前面的單品咖啡。

    3. Decorator類:裝飾者,比如前面的調料

    4. ConcreteDecorator類:具體的裝飾者,比如前面的牛奶。

    如果ConcreteComponent具體子類很多,那么可以再加一個中間層,提取共同部分,通過繼承實現更多不同的具體子類。

    裝飾者解法

    類圖:

    java中的裝飾者模式是什么

    Drink 類就是前面說的抽象類Decorator 是一個裝飾類,含有一個被裝飾的對象(Drink obj)和的cost()方法進行一個費用的疊加計算,遞歸的計算價格Milk和Suger是具體的裝飾者Coffee是被裝飾者主體LongBlack和Espresso是具體實現的被裝飾者實體

    代碼:

    抽象類
    public abstract class Drink {//抽象類
        public String des; // 描述
        private float price = 0.0f;
        public String getDes() {
            return des;
        }
        public void setDes(String des) {
            this.des = des;
        }
        public float getPrice() {
            return price;
        }
        public void setPrice(float price) {
            this.price = price;
        }
        //計算費用的抽象方法
        public abstract float cost();
    }
    裝飾者
    public class Decorator extends Drink {//裝飾者
        private Drink obj;
        public Decorator(Drink obj) { //組合
            this.obj = obj;
        }
        @Override
        public float cost() {
            // getPrice 自己價格
            return super.getPrice() + obj.cost();
        }
        @Override
        public String getDes() {
            // obj.getDes() 輸出被裝飾者的信息
            return des + " " + getPrice() + " && " + obj.getDes();
        }
    }
    public class Milk extends Decorator {//裝飾者子類
        public Milk(Drink obj) {
            super(obj);
            setDes(" 牛奶 ");
            setPrice(2.0f);
        }
    }
    public class Suger extends Decorator {//裝飾者子類
        public Suger(Drink obj) {
            super(obj);
            setDes(" 糖 ");
            setPrice(1.0f);
        }
    }
    被裝飾者
    public class Coffee  extends Drink {//被裝飾者
        @Override
        public float cost() {
            return super.getPrice();
        }
    }
    public class Espresso extends Coffee {//被裝飾者子類
        public Espresso() {
            setDes(" 意式咖啡 ");
            setPrice(6.0f);
        }
    }
    public class LongBlack extends Coffee {//被裝飾者子類
        public LongBlack() {
            setDes(" 美式咖啡 ");
            setPrice(5.0f);
        }
    }
    客戶端測試
    public class Client {
        public static void main(String[] args) {
            // 阿姨的卡布奇諾:意式加兩份牛奶、一份糖
            // 1. 點一份Espresso
            Drink order = new Espresso();
            System.out.println("order1 費用=" + order.cost());
            System.out.println("order1 描述=" + order.getDes());
            // 2.1 order 加一份牛奶
            order = new Milk(order);
            System.out.println("order 加入一份牛奶 費用 =" + order.cost());
            System.out.println("order 加入一份牛奶 描述 = " + order.getDes());
            // 2.2 order 再加一份牛奶
            order = new Milk(order);
            System.out.println("order 加入兩份牛奶 費用 =" + order.cost());
            System.out.println("order 加入兩份牛奶 描述 = " + order.getDes());
            // 3. order 加一份糖
            order = new Suger(order);
            System.out.println("order 兩份牛奶、一份糖 費用 =" + order.cost());
            System.out.println("order 兩份牛奶、一份糖 描述 = " + order.getDes());
            System.out.println("===========================");
            //美式咖啡加一份牛奶
            //1. 點一份LongBlack
            Drink order2 = new LongBlack();
            System.out.println("order2 費用 =" + order2.cost());
            System.out.println("order2 描述 = " + order2.getDes());
            //2. order2 加一份牛奶
            order2 = new Milk(order2);
            System.out.println("order2 加入一份牛奶 費用 =" + order2.cost());
            System.out.println("order2 加入一份牛奶 描述 = " + order2.getDes());
        }
    }

    運行結果:

    java中的裝飾者模式是什么

    總結:

    裝飾者模式就像打包一個快遞,不斷的動態添加新的功能,可以組合出所有情況:

    java中的裝飾者模式是什么

    第一份Milk包含一份Espresso

    第二份Milk包含(Milk+Espresso)

    Suger包含(Milk+Milk+Espresso)

    “java中的裝飾者模式是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

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

    AI

    龙川县| 收藏| 平昌县| 德惠市| 阿鲁科尔沁旗| 始兴县| 黄梅县| 上饶县| 博兴县| 东宁县| 华池县| 万州区| 新河县| 南郑县| 松江区| 淮阳县| 岳普湖县| 宝丰县| 清水县| 固镇县| 涟源市| 定边县| 望奎县| 利津县| 德阳市| 眉山市| 稻城县| 绥阳县| 来凤县| 中牟县| 九台市| 定州市| 阿拉尔市| 晋宁县| 辉县市| 鄂托克旗| 东海县| 乌鲁木齐县| 雅安市| 浮山县| 稻城县|