設計模式-裝飾模式

模式簡介

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();
    }
}

源碼地址:設計模式示例源碼

部分內容引用自互聯網,如涉及侵權請聯繫本人,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章