模式簡介
1、意圖: 動態地給一個對象添加一些額外的職責。就增加功能來說, Decorator模式相比生成子類更爲靈活。該模式以對客 戶端透明的方式擴展對象的功能。
2、適用環境
(1)在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
(2)處理那些可以撤消的職責。
(3)當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,爲支持每一種組合將產生大量的 子類,使得子類數目呈爆炸性增長。另一種情況可能是因爲類定義被隱藏,或類定義不能用於生成子類。
3、參與者
1.Component(被裝飾對象的基類)
定義一個對象接口,可以給這些對象動態地添加職責。
2.ConcreteComponent(具體被裝飾對象)
定義一個對象,可以給這個對象添加一些職責。
3.Decorator(裝飾者抽象類)
維持一個指向Component實例的引用,並定義一個與Component接口一致的接口。
4.ConcreteDecorator(具體裝飾者)
具體的裝飾對象,給內部持有的具體被裝飾對象,增加具體的職責。
優點:Decorator模式與繼承關係的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行爲的組合。 缺點:種比繼承更加靈活機動的特性,也同時意味着更加多的複雜性。裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很複雜。裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行爲,實現“半透明”的裝飾者模式。在實際項目中要做出較佳選擇。 |
UML類圖
案例:個人着裝
Person.java
package main.com.codetears.Decoration;
/**
* @Description 以聚會穿着爲例
* @Date 2019-05-15 11:44
* @Author l'amour solitaire
*/
public abstract class Person {
public abstract void wear();
}
XiaoMa.java
package main.com.codetears.Decoration;
/**
* @Description
* @Date 2019-05-15 13:51
* @Author l'amour solitaire
*/
public class XiaoMa extends Person {
public String name;
XiaoMa(String name) {
this.name = name;
}
@Override
public void wear() {
System.out.print("着裝的 " + name);
}
}
Dress.java
package main.com.codetears.Decoration;
/**
* @Description 裝扮類繼承Person
* @Date 2019-05-15 11:54
* @Author l'amour solitaire
*/
public class Dress extends Person {
public Person componet;
public void set_person(Person person) {
this.componet = person;
}
@Override
public void wear() {
if (componet != null) {
componet.wear();
}
}
}
Jeans.java
package main.com.codetears.Decoration.dress;
import main.com.codetears.Decoration.Dress;
/**
* @Description 具體的裝扮-牛仔褲
* @Date 2019-05-15 13:48
* @Author l'amour solitaire
*/
public class Jeans extends Dress {
@Override
public void wear() {
System.out.print("牛仔褲");
super.wear();
}
}
TShirt.java
package main.com.codetears.Decoration.dress;
import main.com.codetears.Decoration.Dress;
/**
* @Description 具體的裝扮-T恤
* @Date 2019-05-15 13:45
* @Author l'amour solitaire
*/
public class TShirt extends Dress {
@Override
public void wear() {
System.out.print("T恤");
super.wear();
}
}
Client.java
package main.com.codetears.Decoration;
import main.com.codetears.Decoration.dress.Jeans;
import main.com.codetears.Decoration.dress.TShirt;
/**
* @Description
* @Date 2019-05-15 13:53
* @Author l'amour solitaire
*/
public class Client {
public static void main(String[] args) {
XiaoMa xm = new XiaoMa("小馬哥");
TShirt ts = new TShirt();
Jeans js = new Jeans();
ts.set_person(xm);
js.set_person(ts);
js.wear();
}
}
源碼地址:設計模式示例源碼
部分內容引用自互聯網,如涉及侵權請聯繫本人,謝謝!