【结构型】装饰模式(Decorator)

目录

    • 装饰模式(Decorator)
    • 适用场景
    • 装饰模式实例代码(Java)

装饰模式(Decorator)

动态地给一个对象添加一些额外的职责。就增加功能而言,装饰模式 (Decorator) 比生成子类更加灵活。

适用场景

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 处理那些可以撤销的职责。
  • 当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。

【结构型】装饰模式(Decorator)_第1张图片
✦ Component 定义一个对象接口,可以给这些对象动态地添加职责。
✦ ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。
✦ Decorator 维持一个指向 Component 对象的指针,并定义一个与 Component 接口一致的接口。
✦ ConcreteDecorator 向组件添加职责。

装饰模式实例代码(Java)

//对应Component
abstract class Person {
    protected String name;
    public abstract void Operation(); // 职责
}

//对应ConcreteComponent
class Student extends Person {
    public Student(String name) {
        this.name = name;
    }
    @Override
    public void Operation() {
        System.out.print(name + "的职责:学习 ");
    }
}

abstract class Decorator extends Person {
    //Decorator维持一个指向Component对象的指针
    protected Person person;
}

//对应ConcreteDecorator
class DecoratorA extends Decorator {
    public DecoratorA(Person person) {
        this.person = person;
    }
    @Override
    public void Operation() { // 职责
        person.Operation(); // 原本的职责
        System.out.print("写作业 ");
    }
}
//对应ConcreteDecorator
class DecoratorB extends Decorator {
    public DecoratorB(Person person) {
        this.person = person;
    }
    @Override
    public void Operation() { // 职责
        person.Operation(); // 原本的职责
        System.out.print("考试 ");
    }
}


public class DecoratorMain {
    public static void main(String[] args) {
        Person zhangsan = new Student("zhangsan");
        zhangsan = new DecoratorA(zhangsan);
        zhangsan = new DecoratorB(zhangsan);
        zhangsan.Operation();

        System.out.println("\n=====我是分割线=====");

        // 对象链,一次性将职责添加完
        Person lisi = new DecoratorB(new DecoratorA(new Student("lisi")));
        lisi.Operation();
    }
}

其他设计模式详见本专栏其他博文~
特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
zst_2001的个人空间

你可能感兴趣的:(设计模式(Java),java,开发语言)