一、裝飾模式的定義
裝飾模式是一種比較常見的模式,其定義如下:attach additional responsibilities to an object dynamically keeping the same interface.decorators provide a flexible alternative to subclassing for extending functionality.(動態地給一個對象添加額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活)
裝飾模式的通用類圖如圖:
component抽象構件:component是一個接口或者是抽象類,就是定義我們最核心的對象,也就是最原始的對象
concretecomponent具體構件:concretecomponent是最核心、最原始、最基本的接口或抽象類的實現,你要裝飾的就是它
decorator裝飾角色:一般一個抽象類,做什么用呢?實現接口或抽象方法,這里面不一定有抽象的方法,在它的屬性里必然有一個private變量指向component抽象構件
具體裝飾角色:concretedecoratora和concretedecoratorb是兩個具體的裝飾類,你要把你最核心的、最原始的、最基本的東西裝飾成其他東西
抽象構件代碼:
1
2
3
4
|
public abstract class component { //抽象的方法 public abstract void operate(); } |
具體構件代碼:
1
2
3
4
5
6
|
public class concretecomponent extends component { @override public void operate() { system.out.println( "do somthing" ); } } |
抽象裝飾者:
1
2
3
4
5
6
7
8
9
10
11
12
|
public abstract class decorator extends component { private component component = null ; public decorator(component component) { this .component = component; } @override public void operate() { this .component.operate(); } } |
具體裝飾類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class concretedecorator1 extends decorator { public concretedecorator1(component component) { super (component); } private void method1() { system.out.println( "method1 修飾" ); } @override public void operate() { this .method1(); super .operate(); } } public class concretedecorator2 extends decorator { public concretedecorator2(component component) { super (component); } private void method2() { system.out.println( "method2 修飾" ); } @override public void operate() { this .method2(); super .operate(); } } |
場景類:
1
2
3
4
5
6
7
8
9
10
11
|
public class client { public static void main(string args[]) { component component = new concretecomponent(); //第一次修飾 component = new concretedecorator1(component); //第二次修飾 component = new concretedecorator2(component); //修飾后運行 component.operate(); } } |
二、裝飾的優缺點和使用場景
優點:
裝飾類與被裝飾類可以獨立發展,而不會相互耦合。換句話說,component類無需知道decorator類,decorator類是從外部擴展component類的功能,而decorator也不用知道具體的構件
裝飾模式是繼承關系的一個替代方案。我們看裝飾類decorator,不管裝飾多少層,返回的還是component,實現的還是is-a的關系
裝飾模式可以動態地擴展一個實現類的功能
缺點:
對于裝飾模式記住一點就夠了:多層的裝飾是比較復雜的,就像剝洋蔥,剝到了最后才發現是最里層的裝飾出現了問題,因此盡量減少裝飾類的數量,以便降低系統的復雜度。
使用場景:
需要擴展一個累的功能,或者給一個類增加附加功能
需要動態地給一個對象增加功能,這些功能可以再動態的撤銷
需要為一批兄弟累進行改裝或假裝功能,當然首選裝飾模式
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。