動態地給一個對象添加一些額外的職責。就增長功能來講,裝飾模式比生成子類更爲靈活。java
- Component:抽象構件
- 能夠是一個接口或抽象類,其充當的就是被裝飾的原始對象。
- ConcreteComponent:組件具體實現類
- 該類是Component類的基本實現,也是咱們裝飾的具體對象。
- Decorator:抽象裝飾者
- 其承擔的職責就是爲了裝飾咱們的組件對象,其內部必定要有一個指向對象組件的引用。在大多數狀況下,該類爲抽象類,須要根據不一樣的裝飾邏輯實現不一樣的具體子類。固然,若是裝飾邏輯單一,只有一個的狀況下咱們能夠省略該類直接做爲具體的裝飾者。
- ConcreteDecoratorA:裝飾者的具體實現類
- 只是對抽象裝飾者作出具體的實現。
- ConcreteDecoratorB:同上。
- Client:客戶類。
- 須要拓展一個類的功能,或給一個類增長附加功能
- 須要動態地給一個對象增長功能,這些功能能夠再動態地撤銷
- 須要爲一批的兄弟類進行改裝或加裝功能
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();
Context ide