Java設(shè)計模式之裝飾模式原理與用法實例詳解
本文實例講述了Java設(shè)計模式之裝飾模式原理與用法。分享給大家供大家參考,具體如下:
裝飾模式能在不必改變原類文件和使用繼承的情況下,動態(tài)地擴(kuò)展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象。JDK中IO的設(shè)計就用到了裝飾模式,通過過濾流對節(jié)點(diǎn)流進(jìn)行包裝來實現(xiàn)功能的擴(kuò)展。
裝飾模式的角色的組成:
① 抽象構(gòu)件(Component)角色:給出一個抽象接口,以規(guī)范準(zhǔn)備接收附加工功能的對象。(InputStream、OutputStream)
② 具體構(gòu)件(Concrete Component)角色:定義一個將要接收附加功能的類。(節(jié)點(diǎn)流)
③ 裝飾(Decorator)角色:持有一個構(gòu)件(Component)對象的實例,并實現(xiàn)一個與抽象構(gòu)件接口一致的接口。(過濾流FilterInputStream、FilterOutputStream)
④ 具體裝飾(Concrete Decorator)角色:負(fù)責(zé)給構(gòu)件對象添加上附加的功能。(帶具體附加功能的過濾流,BufferedInputStream,DataInputStream等)
以下給出一個裝飾模式的簡單的例子:
1. 抽象構(gòu)件角色:定義一個接口Component
package com.tydic.decorator;
//抽象構(gòu)件角色
public interface Component {
public void doSomething();
}
2. 具體構(gòu)建角色:需要實現(xiàn)抽象構(gòu)件角色,可以給這個對象添加一些職責(zé)。
package com.tydic.decorator;
/**
* 具體構(gòu)建角色,實現(xiàn)抽象構(gòu)建角色
* @author Administrator
*
*/
public class ConcreteComponent implements Component {
@Override
public void doSomething() {
System.out.println("功能A");
}
}
3. 裝飾角色:持有一個對象構(gòu)建角色的引用,并且實現(xiàn)抽象構(gòu)件角色。實現(xiàn)抽象構(gòu)件角色是因為要保證增加了功能過后,類型不能發(fā)生改變,就像FilterInputStream還是一個輸入流,仍然帶有輸入流的特性。而持有一個對象構(gòu)建角色的引用是因為要想增加功能,就必須持有要被附加功能的構(gòu)件角色的引用。
package com.tydic.decorator;
/**
* 裝飾角色,持有一個構(gòu)件角色的引用,并且實現(xiàn)構(gòu)件角色
* 要想增加功能過后還是這個類型的構(gòu)件就必須實現(xiàn)構(gòu)件角色,要想增加功能,就必須持有要被附加功能的構(gòu)件角色的引用,這就是為什么必須持有一個構(gòu)件角色的引用
* @author Administrator
*
*/
public class Decorator implements Component {
private Component component;//這是要被附加功能的構(gòu)件角色,可通過實例化的時候傳進(jìn)來
public Decorator(Component component) {
this.component = component;
}
@Override
public void doSomething() {
component.doSomething();
}
}
4. 具體裝飾角色:需要繼承裝飾角色,并且給出要附加的功能
package com.tydic.decorator;
/**
* 具體裝飾角色1,需要繼承裝飾角色,并且給出要附加的功能
* @author Administrator
*
*/
public class ConcreteDecorator1 extends Decorator {
public ConcreteDecorator1(Component component) {
super(component);
}
@Override
public void doSomething() {
super.doSomething();
this.doAnothing();//在傳過來的具體構(gòu)件角色原有功能的基礎(chǔ)上附加的功能
}
//附加的功能
public void doAnothing() {
System.out.println("功能B");
}
}
package com.tydic.decorator;
/**
* 具體裝飾角色2,需要繼承裝飾角色,并且給出要附加的功能
* @author Administrator
*
*/
public class ConcreteDecorator2 extends Decorator {
public ConcreteDecorator2(Component component) {
super(component);
}
@Override
public void doSomething() {
super.doSomething();
this.doAnothing();//在傳過來的具體構(gòu)件角色原有功能的基礎(chǔ)上附加的功能
}
//附加的功能
public void doAnothing() {
System.out.println("功能c");
}
}
5. 編寫客戶端代碼
package com.tydic.decorator;
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();//具體構(gòu)建角色
Component component2 = new ConcreteDecorator1(component);//對component這個構(gòu)件進(jìn)行裝飾
Component component3 = new ConcreteDecorator2(component2);//對component2這個構(gòu)件進(jìn)行裝飾
component3.doSomething();
}
}
總結(jié):
裝飾模式能夠利用組合的做法,再不用繼承的情況下,在運(yùn)行時動態(tài)的對對象進(jìn)行擴(kuò)展。這是繼承所做不到的。繼承是靜態(tài)的,對類的擴(kuò)展。
裝飾模式的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):1.擴(kuò)展對象的功能,比繼承更加靈活。2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設(shè)計師可以創(chuàng)造出很多不同行為的組合。
缺點(diǎn):會使程序變的比較復(fù)雜。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
SpringMVC打印請求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案
項目中經(jīng)常需要打印http請求的參數(shù)和響應(yīng)數(shù)據(jù),本文給大家講解如何在SpringMVC打印請求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案,感興趣的朋友跟隨小編一起看看吧2023-07-07
maven導(dǎo)入本地倉庫jar包,報:Could?not?find?artifact的解決
這篇文章主要介紹了maven導(dǎo)入本地倉庫jar包,報:Could?not?find?artifact的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

