瞭解23種設計模式之裝飾模式

一,什麼是裝飾模式

裝飾(Decorator)模式又叫做包裝模式。通過一種對客戶端透明的方式來擴展對象的功能,是繼承關係的替換方案。

 

二,裝飾類的結構

 

三,裝飾模式的角色和職責,缺點和優點。

抽象組件角色: 一個抽象接口,是被裝飾類和裝飾類的父接口。

具體組件角色:爲抽象組件的實現類。

抽象裝飾角色:  包含一個組件的引用,並定義了與抽象組件一致的接口

具體裝飾角色:爲抽象裝飾角色的實現類。負責具體的裝飾。

優點:

  • Decorator模式與繼承關係的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。
  • 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行爲的組合。

缺點:

  • 這種比繼承更加靈活機動的特性,也同時意味着更加多的複雜性。
  • 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很複雜。
  • 裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行爲,實現“半透明”的裝飾者模式。在實際項目中要做出最佳選擇。

注意: java IO流的操作就是典型的裝飾模式。
 

四,代碼實現

4.1 抽象組件角色: 一個抽象接口,是被裝飾類和裝飾類的父接口。

/**
 * @ClassName Person  
 * @Description 一個抽象接口,是被裝飾類和裝飾類的父接口。
 * @Version 1.0
 **/
public interface Person {

    public void desc();
}

4.2 具體組件角色:爲抽象組件的實現類。

/**
 * @ClassName Woman
 * @Description 具體組件角色:爲抽象組件的實現類。
 * @Version 1.0
 **/
public class Woman implements Person{

    @Override
    public void desc() {
        System.out.println("這是一個女人");
    }
}

4.3,抽象裝飾角色:  包含一個組件的引用,並定義了與抽象組件一致的接口

/**
 * @ClassName PersonDecorator
 * @Description 抽象裝飾角色:  包含一個組件的引用,並定義了與抽象組件一致的接口
 * @Version 1.0
 **/
public  abstract  class PersonDecorator implements Person {

    private Person person;

    public PersonDecorator(Person person) {
        this.person = person;
    }

    @Override
    public abstract void desc();

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

4.4,爲抽象裝飾角色的實現類。負責具體的裝飾。

/**
 * @ClassName skirtPerson
 * @Description 爲抽象裝飾角色的實現類。負責具體的裝飾。
 * @Version 1.0
 **/
public class SkirtPerson extends PersonDecorator {

    public SkirtPerson(Person person) {
        super(person);
    }

    @Override
    public void desc() {
        super.getPerson().desc();
        this.skirt();
    }

    public void skirt(){
        System.out.println("穿裙子的女人");
    }

}

4.5 測試

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