溫馨提示×

溫馨提示×

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

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

Java裝飾者模式怎么理解

發布時間:2022-01-05 19:45:54 來源:億速云 閱讀:177 作者:iii 欄目:開發技術

本篇內容主要講解“Java裝飾者模式怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java裝飾者模式怎么理解”吧!

    一、裝飾模式的定義和特點

    在軟件開發過程中,有時想用一些現存的組件。這些組件可能只是完成了一些核心功能。但在不改變其結構的情況下,可以動態地擴展其功能。所有這些都可以釆用裝飾器模式來實現。

    就像我們做菜,需要用到調料,菜,刀,火等一系列抽象的組件來最終完成一道菜。

    裝飾模式的定義:

    指在不改變現有對象結構的情況下,動態地給該對象增加一些職責(即增加其額外功能)的模式,它屬于對象結構型模式。就增加功能來說,裝飾模式比生成子類更加靈活。

    特點:

    裝飾器是繼承的有力補充,比繼承靈活,在不改變原有對象的情況下,動態的給一個對象擴展功能,即插即用
    通過使用不用裝飾類及這些裝飾類的排列組合,可以實現不同效果
     裝飾器模式完全遵守開閉原則

    缺點

     裝飾器模式會增加許多子類,過度使用會增加程序得復雜性。

    二、裝飾模式的結構

    裝飾模式的結構一般包含以下幾個角色

    1. 抽象構件(Component)角色:定義一個抽象接口以規范準備接收附加責任的對象。
    2. 具體構件(ConcreteComponent)角色:實現抽象構件,通過裝飾角色為其添加一些職責。
    3. 抽象裝飾(Decorator)角色:繼承抽象構件,并包含具體構件的實例,可以通過其子類擴展具體構件的功能。
    4. 具體裝飾(ConcreteDecorator)角色:實現抽象裝飾的相關方法,并給具體構件對象添加附加的責任。

    圖示

    Java裝飾者模式怎么理解

    三、咖啡點單案例演示

    有一個需求,點一杯咖啡需要咖啡,材料等等,這個案例就很適合裝飾模式,類似于穿衣,點餐,買包子,等等,我們怎么把他設計成裝飾模式呢?

    這個結構就是我已經設計好的一個裝飾模式的類圖,idea自動生成的,這里的Drink就是我們上面說的抽象構建角色,裝飾者是Decorator,他是一個抽象裝飾,下面他的子類就是具體的裝飾者,那么具體構建中間我們提供了一個中間構建,提供了coffee的一些共性,可以放在這里,用的時候直接繼承,他的下面就是相應的具體構件,具體被裝飾者角色,裝飾者與被裝飾者共同繼承自component抽象構件,需要用到裝飾的就是我們點一杯咖啡,用裝飾去包裹即可,層層包裹,案例如下:

    比如我要點一份加糖加奶的拿鐵咖啡

    代碼實例:

    component抽象構件角色:

    package com.decoratorPattern.starBucks;
     
    /**
     * @author wang
     * @version 1.0
     * @packageName com.decoratorPattern.starBucks
     * @className Drink
     * @date 2021/12/28 10:28
     * @Description 飲料構件類抽象component
     */
    public abstract class Drink {
        private String description;
        private float price = 0.0f;
     
        public String getDescription() {
            return description;
        }
     
        public void setDescription(String description) {
            this.description = description;
        }
     
        public float getPrice() {
            return price;
        }
     
        public void setPrice(float price) {
            this.price = price;
        }
     
        /**
         * @Date  2021/12/28 10:30
         * @Param
         * @Return float
         * @MetodName cost
         * @Author wang
         * @Description 計算花費,訂單價格
         */
        public abstract float cost();
    }

    裝飾者類:

    package com.decoratorPattern.starBucks;
     
    /**
     * @author wang
     * @version 1.0
     * @packageName com.decoratorPattern.starBucks
     * @className Decorator
     * @date 2021/12/28 10:40
     * @Description 裝飾者定義類,配料
     */
    public class Decorator extends Drink {
     
        private Drink drink;
     
        /**
         * @param drink
         * @Date 2021/12/28 10:42
         * @Param
         * @Return null
         * @MetodName Decorator
         * @Author wang
         * @Description 傳入一個被裝飾者,由裝飾者進行裝飾
         */
        public Decorator(Drink drink) {
            this.drink = drink;
        }
     
        /**
         * @Date 2021/12/28 10:43
         * @Param
         * @Return float
         * @MetodName cost
         * @Author wang
         * @Description 裝飾者的價格加上被裝飾者的價格
         */
        @Override
        public float cost() {
            return super.getPrice() + drink.cost();
        }
     
        /**
         * @Date 2021/12/28 10:44
         * @Param
         * @Return String
         * @MetodName getDescription
         * @Author wang
         * @Description 輸出訂單信息,包含裝飾者,裝飾者的價格,以及被裝飾者的信息
         */
        @Override
        public String getDescription() {
            return drink.getDescription() + "\n加入的材料:" + super.getDescription()
                    + "\t材料價格:" + super.getPrice() ;
        }
    }

    裝飾者類:

    package com.decoratorPattern.starBucks;
     
    /**
     * @author wang
     * @version 1.0
     * @packageName com.decoratorPattern.starBucks
     * @className Decorator
     * @date 2021/12/28 10:40
     * @Description 裝飾者定義類,配料
     */
    public class Decorator extends Drink {
     
        private Drink drink;
     
        /**
         * @param drink
         * @Date 2021/12/28 10:42
         * @Param
         * @Return null
         * @MetodName Decorator
         * @Author wang
         * @Description 傳入一個被裝飾者,由裝飾者進行裝飾
         */
        public Decorator(Drink drink) {
            this.drink = drink;
        }
     
        /**
         * @Date 2021/12/28 10:43
         * @Param
         * @Return float
         * @MetodName cost
         * @Author wang
         * @Description 裝飾者的價格加上被裝飾者的價格
         */
        @Override
        public float cost() {
            return super.getPrice() + drink.cost();
        }
     
        /**
         * @Date 2021/12/28 10:44
         * @Param
         * @Return String
         * @MetodName getDescription
         * @Author wang
         * @Description 輸出訂單信息,包含裝飾者,裝飾者的價格,以及被裝飾者的信息
         */
        @Override
        public String getDescription() {
            return drink.getDescription() + "\n加入的材料:" + super.getDescription()
                    + "\t材料價格:" + super.getPrice() ;
        }
    }

    具體構件類:拿鐵

    package com.decoratorPattern.starBucks;
     
    /**
     * @author wang
     * @version 1.0
     * @packageName com.decoratorPattern.starBucks
     * @className latte
     * @date 2021/12/28 10:32
     * @Description 拿鐵咖啡實類,被裝飾者
     */
    public class Latte extends Coffee{
        public Latte() {
            setDescription("拿鐵咖啡");
            setPrice(15.0f);
        }
    }

    具體構件類:摩卡

    package com.decoratorPattern.starBucks;
     
    /**
     * @author wang
     * @version 1.0
     * @packageName com.decoratorPattern.starBucks
     * @className Mocha
     * @date 2021/12/28 10:36
     * @Description 摩卡咖啡實類,被裝飾者
     */
    public class Mocha extends Coffee {
        public Mocha() {
            setDescription("摩卡咖啡");
            setPrice(12.2f);
        }
    }

    其他同上,不過多展示

     具體裝飾類:牛奶

    package com.decoratorPattern.starBucks;
     
    /**
     * @author wang
     * @version 1.0
     * @packageName com.decoratorPattern.starBucks
     * @className Milk
     * @date 2021/12/28 10:47
     * @Description 牛奶調味品,具體裝飾者
     */
    public class Milk extends Decorator{
     
        /**
         * @param drink
         * @Date 2021/12/28 10:42
         * @Param
         * @Return null
         * @MetodName Decorator
         * @Author wang
         * @Description 傳入一個被裝飾者,由裝飾者進行裝飾
         */
        public Milk(Drink drink) {
            super(drink);
            setDescription("牛奶");
            setPrice(1.0f);
        }
    }

    具體裝飾:糖

    package com.decoratorPattern.starBucks;
     
    /**
     * @author wang
     * @version 1.0
     * @packageName com.decoratorPattern.starBucks
     * @className sugar
     * @date 2021/12/28 10:50
     * @Description 糖,裝飾者
     */
    public class Sugar extends Decorator{
        /**
         * @param drink
         * @Date 2021/12/28 10:42
         * @Param
         * @Return null
         * @MetodName Decorator
         * @Author wang
         * @Description 傳入一個被裝飾者,由裝飾者進行裝飾
         */
        public Sugar(Drink drink) {
            super(drink);
            setDescription("糖");
            setPrice(0.5f);
        }
    }

    訂單測試代碼:

    package com.decoratorPattern.starBucks;
     
    /**
     * @author wang
     * @version 1.0
     * @packageName com.decoratorPattern.starBucks
     * @className OrderTest
     * @date 2021/12/28 10:51
     * @Description 前臺訂單類
     */
    public class OrderTest {
        public static void main(String[] args) {
            //點一份加糖加奶的拿鐵咖啡
     
            System.out.println("+++++++沒加任何東西+++++++");
            Drink latte = new Latte();
            System.out.println("當前總價:" + latte.cost());
            System.out.println("coffee:" +latte.getDescription());
            //加糖
            System.out.println("+++++++加糖后+++++++");
            latte = new Sugar(latte);
            System.out.println("當前總價:" + latte.cost());
            System.out.println("coffee:" + latte.getDescription());
     
            System.out.println("+++++++加奶后+++++++");
            latte = new Milk(latte);
            System.out.println("當前總價:" + latte.cost());
            System.out.println("coffee:" +latte.getDescription());
        }
    }
    /**
     * +++++++沒加任何東西+++++++
     * 當前總價:15.0
     * coffee:拿鐵咖啡
     * +++++++加糖后+++++++
     * 當前總價:15.5
     * coffee:拿鐵咖啡
     * 加入的材料:糖	材料價格:0.5
     * +++++++加奶后+++++++
     * 當前總價:16.5
     * coffee:拿鐵咖啡
     * 加入的材料:糖	材料價格:0.5
     * 加入的材料:牛奶	材料價格:1.0
     *
     * Process finished with exit code 0
     */

    綜上, 如果我們需要新的咖啡種類或者是新的調料,只需要新增類去繼承coffee或者decorator類即可。

    到此,相信大家對“Java裝飾者模式怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

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

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女