溫馨提示×

溫馨提示×

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

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

Java裝飾者模式的示例分析

發(fā)布時間:2022-02-28 09:25:13 來源:億速云 閱讀:144 作者:小新 欄目:開發(fā)技術

小編給大家分享一下Java裝飾者模式的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    定義

    裝飾者模式:在不改變原有對象的基礎之上,動態(tài)的將功能附加到對象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則

    案例

    需求

    一個人去咖啡店點了一杯卡布奇諾,加了一份熱牛奶

    方案

    定義咖啡基類

    public abstract class Coffee {
        private String desc;
    
        private float price;
    
        public abstract float cost();
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        public float getPrice() {
            return price;
        }
    
        public void setPrice(float price) {
            this.price = price;
        }
    }

    定義卡布奇諾咖啡類,繼承咖啡基類

    public class Cappuccino extends Coffee{
        public Cappuccino(){
            setDesc("點了一杯卡布奇諾");
            setPrice(100);
        }
    
        @Override
        public float cost() {
            System.out.println("當前價格為:" + super.getPrice());
            return super.getPrice();
        }
    }

    定義裝飾者類

    public class Decorator extends Coffee{
    
        private Coffee coffee;
    
        public Decorator(Coffee coffee){
            this.coffee = coffee;
        }
    
        @Override
        public float cost() {
            return super.getPrice() + this.coffee.cost();
        }
    
        @Override
        public String getDesc() {
            return super.getDesc() + coffee.cost();
        }
    }

    定義熱牛奶類

    public class HotMilk extends Decorator {
        public HotMilk(Coffee coffee){
            super(coffee);
            setPrice(200);
            setDesc("點了一杯熱牛奶");
        }
    }

    定義測試類

    public class Test {
        public static void main(String[] args) {
            // 點了一杯卡布奇諾,還加了一份熱牛奶
            Coffee coffee = new Cappuccino();
            System.out.println(coffee.getDesc());
            //System.out.println(coffee.getPrice());
            System.out.println(coffee.cost());;
    
            HotMilk hotMilk = new HotMilk(coffee);
            System.out.println(hotMilk.getDesc());
            //System.out.println(hotMilk.getPrice());
            System.out.println(hotMilk.cost());
        }
    }

    查看測試結果

    Java裝飾者模式的示例分析

    分析

    裝飾者模式的目的也是為了擴展對象的功能,是繼承的一個替代模式,可以動態(tài)的擴展一個實現(xiàn)類的功能,裝飾類和被裝飾類可以相互獨立,不會耦合,靈活方便。

    使用場景

    • 需要給一個現(xiàn)有類添加職責,但是有不能采用生成子類的方式去擴充的時候,

    • 當需要對于現(xiàn)有的一組基本功能進行組合,會產生非常多的功能的時候

    • 當對象的功能要求可以動態(tài)的添加,或者說的動態(tài)的撤銷

    知識點補充

    裝飾模式的定義和特點

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

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

    裝飾模式的定義:

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

    特點:

    • 裝飾器是繼承的有力補充,比繼承靈活,在不改變原有對象的情況下,動態(tài)的給一個對象擴展功能,即插即用

    • 通過使用不用裝飾類及這些裝飾類的排列組合,可以實現(xiàn)不同效果

    • 裝飾器模式完全遵守開閉原則

    缺點

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

    裝飾模式的結構

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

    1. 抽象構件(Component)角色:定義一個抽象接口以規(guī)范準備接收附加責任的對象。

    2. 具體構件(ConcreteComponent)角色:實現(xiàn)抽象構件,通過裝飾角色為其添加一些職責。

    3. 抽象裝飾(Decorator)角色:繼承抽象構件,并包含具體構件的實例,可以通過其子類擴展具體構件的功能。

    4. 具體裝飾(ConcreteDecorator)角色:實現(xiàn)抽象裝飾的相關方法,并給具體構件對象添加附加的責任。

    以上是“Java裝飾者模式的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

    向AI問一下細節(jié)

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

    AI