裝飾者模式Decorator(包裝器Wrapper)

定義

動態地給一個對象添加一些額外的職責。就增長功能來講,裝飾模式比生成子類更爲靈活。java

裝飾者模式類圖:

類圖說明:

  • Component:抽象構件
    • 能夠是一個接口或抽象類,其充當的就是被裝飾的原始對象。
  • ConcreteComponent:組件具體實現類
    • 該類是Component類的基本實現,也是咱們裝飾的具體對象。
  • Decorator:抽象裝飾者
    • 其承擔的職責就是爲了裝飾咱們的組件對象,其內部必定要有一個指向對象組件的引用。在大多數狀況下,該類爲抽象類,須要根據不一樣的裝飾邏輯實現不一樣的具體子類。固然,若是裝飾邏輯單一,只有一個的狀況下咱們能夠省略該類直接做爲具體的裝飾者。
  • ConcreteDecoratorA:裝飾者的具體實現類
    • 只是對抽象裝飾者作出具體的實現。
  • ConcreteDecoratorB:同上。
  • Client:客戶類。

使用場景

  • 須要拓展一個類的功能,或給一個類增長附加功能
  • 須要動態地給一個對象增長功能,這些功能能夠再動態地撤銷
  • 須要爲一批的兄弟類進行改裝或加裝功能

裝飾着模式Demo

abstract class Person {
    abstract void dress();
}

class Boy extends Person {

    @Override
    void dress() {
        Log.e("xupeng", "男孩穿衣服");
    }
}

class Girl extends Person {

    @Override
    void dress() {
        Log.e("xupeng", "女孩穿衣服");
    }
}

abstract class PersonCloth extends Person {

    private Person mPerson;

    public PersonCloth(Person person) {
        mPerson = person;
    }

    @Override
    void dress() {
        mPerson.dress();
    }
}

class Expansive extends PersonCloth {

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

    @Override
    void dress() {
        super.dress();
        Log.e("xupeng", "貴衣服");
    }
}

class Cheap extends PersonCloth {

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

    @Override
    void dress() {
        super.dress();
        Log.e("xupeng", "便宜衣服");
    }
}
Person person = new Boy();
person = new Expansive(person);
person = new Cheap(person);
person.dress();

在Android中的應用

Context ide

http://www.javashuo.com/article/p-yegqpqxb-hz.htmlspa

相關文章
相關標籤/搜索