动态地给一个对象添加一些额外的职责。就增长功能来讲,装饰模式比生成子类更为灵活。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