摘要:裝飾者模式遵循了開(kāi)閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。但是在使用裝飾者模式的同時(shí)可能會(huì)引入大量小類,而且使用裝飾者模式除了實(shí)例化組件外,還要把組件包裝進(jìn)裝飾者,會(huì)使代碼顯得不易理解。
1. 簡(jiǎn)介
??裝飾者模式是一種結(jié)構(gòu)型模式,它可以動(dòng)態(tài)的將責(zé)任附加到對(duì)象上,在擴(kuò)展功能方面,它比繼承更有彈性。裝飾者模式遵循了開(kāi)閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
??雖然在裝飾者模式中也使用了繼承,但是繼承只是為了與被裝飾者擁有共同的父類,達(dá)到類型匹配的目的,而不是為了獲得父類的行為。因?yàn)檠b飾者與被裝飾者擁有共同的父類,所以在任何需要原始對(duì)象的場(chǎng)合,都可以用裝飾過(guò)的對(duì)象替代它。但是在使用裝飾者模式的同時(shí)可能會(huì)引入大量小類,而且使用裝飾者模式除了實(shí)例化組件外,還要把組件包裝進(jìn)裝飾者,會(huì)使代碼顯得不易理解。
??ConcreteComponent是具體組件,也就是被裝飾者。Decorator是抽象裝飾者,與ConcreteComponent擁有共同的超類Component————它是一個(gè)抽象組件,在具體裝飾者ConcreteDecoratorA和ConcreteDecoratorB中有一個(gè)實(shí)例變量,可以記錄被裝飾的事物。
3. 實(shí)例??去食堂吃飯,假如你想吃面條,食堂有牛肉面和熱干面,還可以加青菜、煎蛋、香腸等配料,以后還可能增加更多的配料,在計(jì)算價(jià)格時(shí)需要根據(jù)不同的配料來(lái)計(jì)算,這里就可以用到裝飾者模式。
抽象組件:
public abstract class Noodles { protected String desc; public String getDesc() { return desc; } public abstract double cost(); }
具體組件:
public class BeefNoodles extends Noodles { public BeefNoodles() { desc = "Beef Noodles."; } public double cost() { return 10.0; } } public class HotDryNoodles extends Noodles { public HotDryNoodles() { desc = "Hot Dry Noodles."; } public double cost() { return 8.0; } }
抽象裝飾者:
//繼承自Noodles,使裝飾者與組件擁有共同的超類 public abstract class Condiment extends Noodles { public abstract String getDesc(); }
具體裝飾者:
public class Vegetable extends Condiment { private Noodles noodles; public Vegetable(Noodles noodles) { this.noodles = noodles; } public String getDesc() { return noodles.getDesc() + ", vegetable"; } public double cost() { return noodles.cost() + 2.0; } } public class Egg extends Condiment { private Noodles noodles; public Egg(Noodles noodles) { this.noodles = noodles; } public String getDesc() { return noodles.getDesc() + ", egg"; } public double cost() { return noodles.cost() + 3.0; } } public class Sausage extends Condiment { private Noodles noodles; public Sausage(Noodles noodles) { this.noodles = noodles; } public String getDesc() { return noodles.getDesc() + ", Sausage"; } public double cost() { return noodles.cost() + 4.0; } }
測(cè)試:
public class Test { public static void main(String[] args) { Noodles noodles = new BeefNoodles(); System.out.println(noodles.getDesc() + ", " + noodles.cost()); noodles = new Vegetable(noodles); noodles = new Egg(noodles); noodles = new Sausage(noodles); System.out.println(noodles.getDesc() + ", " + noodles.cost()); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/71628.html
摘要:裝飾者模式組成結(jié)構(gòu)抽象構(gòu)件給出抽象接口或抽象類,以規(guī)范準(zhǔn)備接收附加功能的對(duì)象。裝飾者模式圖解裝飾者模式應(yīng)用場(chǎng)景需要擴(kuò)展一個(gè)類的功能,或給一個(gè)類添加附加職責(zé)。裝飾者對(duì)象接受所有來(lái)自客戶端的請(qǐng)求。參考資料設(shè)計(jì)模式 一、了解裝飾者模式 1.1 什么是裝飾者模式 裝飾者模式指的是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾者來(lái)包裹真實(shí)的對(duì)...
摘要:相關(guān)設(shè)計(jì)模式裝飾者模式和代理模式裝飾者模式關(guān)注再一個(gè)對(duì)象上動(dòng)態(tài)添加方法代理模式關(guān)注再對(duì)代理對(duì)象的控制訪問(wèn),可以對(duì)客戶隱藏被代理類的信息裝飾著模式和適配器模式都叫包裝模式關(guān)于新職責(zé)適配器也可以在轉(zhuǎn)換時(shí)增加新的職責(zé),但主要目的不在此。 0x01.定義與類型 定義:裝飾模式指的是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真實(shí)的...
摘要:簡(jiǎn)介代理模式和裝飾者模式是兩種常見(jiàn)的設(shè)計(jì)模式。這里通過(guò)構(gòu)造函數(shù)的參數(shù)將被代理對(duì)象傳入到代理中,也可以通過(guò)其它方式,如提供一個(gè)方法。下面是的代碼輸出首先依然是先創(chuàng)建一個(gè)需要被代理的對(duì)象,然后把它傳入到的構(gòu)造函數(shù)中。 簡(jiǎn)介 代理模式和裝飾者模式是兩種常見(jiàn)的設(shè)計(jì)模式。代理模式是為其它對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以...
摘要:這是設(shè)計(jì)模式系列的第二篇,系列文章目錄如下用一句話總結(jié)那些殊途同歸的設(shè)計(jì)模式工廠策略模版方法美顏相機(jī)中的設(shè)計(jì)模式裝飾者模式幾乎所有的設(shè)計(jì)模式都是通過(guò)增加一層抽象來(lái)解決問(wèn)題。 這是設(shè)計(jì)模式系列的第二篇,系列文章目錄如下: 用一句話總結(jié)那些殊途同歸的設(shè)計(jì)模式:工廠=?策略=?模版方法 美顏相機(jī)中的設(shè)計(jì)模式——裝飾者模式 幾乎所有的設(shè)計(jì)模式都是通過(guò)增加一層抽象來(lái)解決問(wèn)題。 上一篇中提...
摘要:聲明這個(gè)系列為閱讀設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐曾探著一書的讀書筆記裝飾者模式的定義裝飾者模式能夠在不改變對(duì)象自身的基礎(chǔ)上,在程序運(yùn)行期間給對(duì)像動(dòng)態(tài)的添加職責(zé)。與繼承相比,裝飾者是一種更輕便靈活的做法。裝飾者模式的作用就是為對(duì)象動(dòng)態(tài)的加入某些行為。 聲明:這個(gè)系列為閱讀《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》 ----曾探@著一書的讀書筆記 裝飾者模式的定義: 裝飾者(decorator)模式能...
閱讀 2383·2021-11-24 10:26
閱讀 2583·2021-11-16 11:44
閱讀 1701·2021-09-22 15:26
閱讀 3577·2021-09-10 11:11
閱讀 3190·2021-09-07 10:25
閱讀 3627·2021-09-01 10:41
閱讀 1012·2021-08-27 13:11
閱讀 3509·2021-08-16 11:02