摘要:裝飾模式值的是在不必改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。裝飾模式會(huì)導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小類(lèi),如果過(guò)度使用,會(huì)使程序變得很復(fù)雜。裝飾模式是針對(duì)抽象組件類(lèi)型編程。
裝飾模式值的是在不必改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真實(shí)的對(duì)象
需要擴(kuò)展一個(gè)類(lèi)的功能,或給一個(gè)類(lèi)添加附件職責(zé)
需要?jiǎng)討B(tài)的給一個(gè)對(duì)象添加功能,這些功能可以再動(dòng)態(tài)的撤銷(xiāo)
需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變的不現(xiàn)實(shí)
當(dāng)不能采用生成子類(lèi)的方法進(jìn)行擴(kuò)充時(shí),一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的結(jié)構(gòu)就可以在外部
增加附加的功能。在面向?qū)ο蟮脑O(shè)計(jì)中,通常是通過(guò)繼承來(lái)實(shí)現(xiàn)給定類(lèi)的功能擴(kuò)展
裝飾模式:可以就在字面意思理解
比如人的衣服裝飾 早上天氣好 我要穿上上衣還有褲子。但是到了中午的時(shí)候天氣不好了,就要加一件外套。
當(dāng)如果要用Java設(shè)計(jì)對(duì)象來(lái)表現(xiàn)的話,就會(huì)想到的是繼承,冷了我就繼承這個(gè)原有的我加一個(gè)外套屬性,如果繼續(xù)冷,我就繼續(xù)加。加到不冷為止
這個(gè)時(shí)候就會(huì)發(fā)現(xiàn)繼承類(lèi)是不是太多了。為了不斷的加衣服。這個(gè)時(shí)候裝飾模式就有了作用
對(duì)象設(shè)計(jì)
共有的:人和衣服都是可以被展示出來(lái)的
人是有名字的
衣服都是裝飾品
首先是人這個(gè)類(lèi)
public class Person {
?
? ?public Person(){}
?
? ?private String name;
?
? ?public Person(String name){
? ? ? ?this.name = name;
? }
?
? ?public void show(){
? ? ? ?System.out.println("裝扮的--->"+name);
? }
}
?
穿衣要繼承自人這個(gè)類(lèi) 穿衣可以理解為一個(gè)行為。有了這個(gè)行為才可以裝飾衣服
public class Costume extends Person {
?
? ?protected Person component;
?
? ?public void Decorate(Person component){
? ? ? ?this.component = component;
? }
?
? ?@Override
? ?public void show(){
? ? ? ?if (component != null){
? ? ? ? ? ?component.show();
? ? ? }
? }
}
穿上衣服要有穿衣行為這個(gè)動(dòng)作 所以要繼承這個(gè)行為
public class BigTrouser extends Costume{
?
? ?@Override
? ?public void show() {
? ? ? ?super.show();
? ? ? ?System.out.println("褲子");
? }
}
?
褲子也就是和這個(gè)一樣 只要繼承這個(gè)穿衣行文就可以了
在main方法中。使用代碼
Person person = new Person("老大");
? ? ? ?TShirte tShirte = new TShirte();
? ? ? ?BigTrouser bigTrouser = new BigTrouser();
? ? ? ?tShirte.Decorate(person);
? ? ? ?bigTrouser.Decorate(tShirte);
? ? ? ?bigTrouser.show();
這個(gè)是不是和IO流的包裹很像,IO流是使用的裝飾模式。這就就不能累加繼承而是進(jìn)行包裹來(lái)增加功能
如果想穿上外套就只要在繼承這個(gè)穿衣行文,進(jìn)行包裹就可以了。
下面是百度百科的
優(yōu)點(diǎn):
Decorator模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但是Decorator可以提供比繼承更多的靈活性。
通過(guò)使用不同的具體裝飾類(lèi)以及這些裝飾類(lèi)的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合。
缺點(diǎn):
這種比繼承更加靈活機(jī)動(dòng)的特性,也同時(shí)意味著更加多的復(fù)雜性。
裝飾模式會(huì)導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小類(lèi),如果過(guò)度使用,會(huì)使程序變得很復(fù)雜。
裝飾模式是針對(duì)抽象組件(Component)類(lèi)型編程。但是,如果你要針對(duì)具體組件編程時(shí),就應(yīng)該重新思考你的應(yīng)用架構(gòu),以及裝飾者是否合適。當(dāng)然也可以改變Component接口,增加新的公開(kāi)的行為,實(shí)現(xiàn)“半透明”的裝飾者模式。在實(shí)際項(xiàng)目中要做出最佳選擇
設(shè)計(jì)原則:
多用組合,少用繼承。
利用繼承設(shè)計(jì)子類(lèi)的行為,是在編譯時(shí)靜態(tài)決定的,而且所有的子類(lèi)都會(huì)繼承到相同的行為。然而,如果能夠利用組合的做法擴(kuò)展對(duì)象的行為,就可以在運(yùn)行時(shí)動(dòng)態(tài)地進(jìn)行擴(kuò)展。
類(lèi)應(yīng)設(shè)計(jì)的對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70921.html
摘要:裝飾者模式組成結(jié)構(gòu)抽象構(gòu)件給出抽象接口或抽象類(lèi),以規(guī)范準(zhǔn)備接收附加功能的對(duì)象。裝飾者模式圖解裝飾者模式應(yīng)用場(chǎng)景需要擴(kuò)展一個(gè)類(lèi)的功能,或給一個(gè)類(lèi)添加附加職責(zé)。裝飾者對(duì)象接受所有來(lái)自客戶端的請(qǐng)求。參考資料設(shè)計(jì)模式 一、了解裝飾者模式 1.1 什么是裝飾者模式 裝飾者模式指的是在不必改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾者來(lái)包裹真實(shí)的對(duì)...
摘要:通常有兩種方式可以實(shí)現(xiàn)給一個(gè)類(lèi)或?qū)ο笤黾有袨槔^承機(jī)制,使用繼承機(jī)制是給現(xiàn)有類(lèi)添加功能的一種有效途徑,通過(guò)繼承一個(gè)現(xiàn)有類(lèi)可以使得子類(lèi)在擁有自身方法的同時(shí)還擁有父類(lèi)的方法。 裝飾模式 (Decorator Pattern) 裝飾模式能夠?qū)崿F(xiàn)動(dòng)態(tài)的為對(duì)象添加功能,是從一個(gè)對(duì)象外部來(lái)給對(duì)象添加功能。通常有兩種方式可以實(shí)現(xiàn)給一個(gè)類(lèi)或?qū)ο笤黾有袨椋? 繼承機(jī)制,使用繼承機(jī)制是給現(xiàn)有類(lèi)添加功能的一種...
摘要:相關(guān)設(shè)計(jì)模式裝飾者模式和代理模式裝飾者模式關(guān)注再一個(gè)對(duì)象上動(dòng)態(tài)添加方法代理模式關(guān)注再對(duì)代理對(duì)象的控制訪問(wèn),可以對(duì)客戶隱藏被代理類(lèi)的信息裝飾著模式和適配器模式都叫包裝模式關(guān)于新職責(zé)適配器也可以在轉(zhuǎn)換時(shí)增加新的職責(zé),但主要目的不在此。 0x01.定義與類(lèi)型 定義:裝飾模式指的是在不必改變?cè)?lèi)文件和使用繼承的情況下,動(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ì)象可以...
摘要:裝飾者模式遵循了開(kāi)閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。但是在使用裝飾者模式的同時(shí)可能會(huì)引入大量小類(lèi),而且使用裝飾者模式除了實(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)閉。??雖然在裝飾者模式中也使用了繼承,但是繼承只是...
摘要:這是設(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)題。 上一篇中提...
閱讀 3056·2021-09-27 13:35
閱讀 681·2021-09-23 11:22
閱讀 2963·2019-08-30 15:54
閱讀 1686·2019-08-29 16:27
閱讀 2542·2019-08-29 15:05
閱讀 2418·2019-08-23 18:11
閱讀 3588·2019-08-23 16:32
閱讀 2999·2019-08-23 14:56