本文實例講述了java設(shè)計模式之裝飾模式原理與用法。分享給大家供大家參考,具體如下:
裝飾模式能在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象。jdk中io的設(shè)計就用到了裝飾模式,通過過濾流對節(jié)點流進行包裝來實現(xiàn)功能的擴展。
裝飾模式的角色的組成:
① 抽象構(gòu)件(component)角色:給出一個抽象接口,以規(guī)范準備接收附加工功能的對象。(inputstream、outputstream)
② 具體構(gòu)件(concrete component)角色:定義一個將要接收附加功能的類。(節(jié)點流)
③ 裝飾(decorator)角色:持有一個構(gòu)件(component)對象的實例,并實現(xiàn)一個與抽象構(gòu)件接口一致的接口。(過濾流filterinputstream、filteroutputstream)
④ 具體裝飾(concrete decorator)角色:負責(zé)給構(gòu)件對象添加上附加的功能。(帶具體附加功能的過濾流,bufferedinputstream,datainputstream等)
以下給出一個裝飾模式的簡單的例子:
1. 抽象構(gòu)件角色:定義一個接口component
1
2
3
4
5
|
package com.tydic.decorator; //抽象構(gòu)件角色 public interface component { public void dosomething(); } |
2. 具體構(gòu)建角色:需要實現(xiàn)抽象構(gòu)件角色,可以給這個對象添加一些職責(zé)。
1
2
3
4
5
6
7
8
9
10
11
12
|
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)件角色的引用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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)件角色,可通過實例化的時候傳進來 public decorator(component component) { this .component = component; } @override public void dosomething() { component.dosomething(); } } |
4. 具體裝飾角色:需要繼承裝飾角色,并且給出要附加的功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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. 編寫客戶端代碼
1
2
3
4
5
6
7
8
9
|
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)件進行裝飾 component component3 = new concretedecorator2(component2); //對component2這個構(gòu)件進行裝飾 component3.dosomething(); } } |
總結(jié):
裝飾模式能夠利用組合的做法,再不用繼承的情況下,在運行時動態(tài)的對對象進行擴展。這是繼承所做不到的。繼承是靜態(tài)的,對類的擴展。
裝飾模式的優(yōu)缺點:
優(yōu)點:1.擴展對象的功能,比繼承更加靈活。2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設(shè)計師可以創(chuàng)造出很多不同行為的組合。
缺點:會使程序變的比較復(fù)雜。
希望本文所述對大家java程序設(shè)計有所幫助。
原文鏈接:https://blog.csdn.net/zw19910924/article/details/45226537