目的
动态的给一个对象添加一些额外的职责. 它使用客户端透明的方式来扩展对象功能, 并且该模式要比继承更为灵活.
适用范围
以动态透明的方式来给单个对象添加职责.
处理可以撤销的职责.
不能采用生成子类的情况进行扩充. 其一是有大量的扩展, 为了支持每种组合需要产生大量的子类, 使子类数目呈现爆炸性增长. 其二是类的定义被隐藏或者不能用来生成子类.
涉及组件
抽象组件: 定义一个抽象的接口, 规范准备附加的类.
具体组件: 将要被附加功能的类, 它实现抽象的接口.
抽象装饰者: 持有对具体构建角色的引用并且定义与抽象构建角色一致的接口.
具体装饰: 实现抽象装饰者角色, 负责对具体构建添加额外功能.
类图
代码
- Component
- public interface Person{
- void say();
- }
- ConcreteComponent
- public class Man implements Person{
- public void say(){
- System.out.println("hello,");
- }
- }
- Decorator
- public abstract class Decorator implements Person{
- protected Person person;
- public void setPerson(Person person){
- this.person = person;
- }
- public void say(){
- person.say();
- }
- }
- ConcreteDecorator
- public class menDecoratorA extends Decorator{
- public void say(){
- super.say();
- reSay();
- System.out.println("menDecoratorA 类");
- }
- public void reSay(){
- System.out.println("Nice to meet you!");
- }
- }
- public class menDecoratorB extends Decorator{
- public void say(){
- super.say();
- System.out.println("How are you");
- System.out.println("menDecoratorB 类");
- }
- }
- Test
- public class Main{
- public static void main(String args[]){
- Man man = new Man();
- menDecoratorA md1 = new menDecoratorA();
- menDecoratorB md2 = new menDecoratorB();
- md1.setPerson(man);
- md2.setPerson(md1);
- md2.say();
- }
- }
小结
装饰者模式可以动态的将职责附加到对象身上. 它提供了有别于类继承的另外一种灵活的扩展方式.
它在不修改原代码的情况下允许对象的行为被扩展.
它意味着一群包装具体组件的装饰者类.
装饰者模式可以在类的前边或者后边加上新的行为, 甚至可以将类完全取代.
可以有多个装饰者对一个类进行装饰.
装饰者对组件的客户是透明的, 除非客户程序依赖于具体的组件类型.
来源: http://www.bubuko.com/infodetail-3320022.html