1. 程式人生 > 其它 >ES8(2017)新特性:async/await、Object.values、Object.entries、String padding等

ES8(2017)新特性:async/await、Object.values、Object.entries、String padding等

設計模式之裝飾著模式
  1. 簡單例子說明裝飾者模式

    1. 星巴克咖啡訂單專案(咖啡管)

      1. 咖啡種類:Espresso(義大利濃咖啡)、shortBlack、LongBlack、Decaf

      2. 調料:Milk、Chicilate、Soy(豆漿)

      3. 要求在擴充套件新的咖啡時,具有良好的延展性、改動方便、維護方便

      4. 使用OO來計算不同種類咖啡的費用:使用者可以點單品咖啡,也可以單品+調料組合

    2. 實施方案

      1. 方案一(不推薦)

        1. 類圖

        2. 分析

          1. Drink是一個抽象類,表示飲料

          2. des就是對咖啡的描述,比如咖啡封頂名字,價格等等

          3. cost()就是計算費用,在Drink是一個抽象方法

          4. 單品咖啡繼承了Drink

          5. Espress && Milk就是單品咖啡+調料。這種組合很多

        3. 缺點:

          1. 這樣設計時,當我們增加一個新非咖啡種類或者調料時,類的數量機會倍增,就會出現類爆炸

      2. 方案二(比方案一好一些)

        1. 上面在方案一分析出,如果使用方案一會發生類爆炸,因此方案二進行了改進,將調料內建到Drink,這樣就不會造成類的數量過多,從而提高專案的維護性

        2. 類圖

        3. 分析

          1. 方案二可以控制類的數量,不至於造成很多的類

          2. 在增加或者刪除調料種類時,程式碼的維護量還是很大

          3. 考慮到使用者可以新增多份調料時,可以將hasXXX()返回一個int

          4. 考慮使用裝飾者模模式

  2. 通過裝飾者模式解決上面兩種解決方案的不足、

    1. 裝飾者模式定義

      1. 裝飾者模式:動態的將新功能附加到物件上,在物件功能擴充套件方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則

      2. 這裡提到的動態的將新功能附加到物件和ocp原則,在程式碼會會得以體現

    2. 裝飾者模式原理

      1. 說明

      2. 實現圖

      3. 程式碼實現

        //注意分包
        //編寫Drink,這是一個比較重要的類
        public abstract class Drink{
        public String des;//對Drink的描述
        private float price = 0.0f;
        //增加get和set方法
        //計算 費用的抽象方法
        public abstract float cost();
        }
        //編寫coffee類
        public class Coffee extends Drink{
        @Iverride
        public float cost(){
        super.getPrice();
        }
        }
        //編寫具體的咖啡種類
        public class Espresso extends Coffee{
        public Espresso(){
        setDes("義大利濃咖啡");
        setPrice(6.0f);
        }
        }
        //其他咖啡參考Espresso來寫就可以了

        //裝飾者
        public class Decorator extend Drink{
        private Drink obj;
        public Decorator(Drink obj){
        this.obj =obj;
        }
        @Override
        public float cost(){
        return super.getPrice() + obj.cost();
        }

        @Override
        public String getDes(){
        //obj.getDes()輸出被裝飾者的資訊
        return super.des + " " + super.getPrice() + " && " +obj.getDes();
        }
        }

        //編寫調味品的資訊
        // 巧克力
        public class Chocolate extends Decorator{
        public Chocolate(Drink obj){
        super(obj);
        setDes("巧克力");
        //設定當前調味品的價格
        setprice(3.0f);
        }
        }

        //其他的調味品參考巧克力


        //下訂單
        public class CoffeeBar{
        public static void main(String[] args){
        //下訂單:2分巧克力+一份牛奶的LongBlack,補全調味品
        //步驟1:點一份被裝飾者
        Drink order = new LongBalck();
        System.out.println("費用1 = "+order.cost());

        //步驟2:加入一份牛奶
        order = new Milk(order);
        //步驟3:加入一份巧克力
        order = new Chocolate(order);
        //步驟4:在加入一份巧樂力
        order = new Chocolate(order);
        System.out.println("描述 = "+order.getDes());
        System.out.println("費用 = "+order.cost());

        }
        }

      4. 裝飾者模式在JDK應用中的原始碼

        1. java的I/o結構,FilterInputStream就是一個裝飾者

        2. 程式碼