装饰器模式


1. 类图

image.png

  • Component:组件对象的接口,可以给这些对象动态地添加职责
  • ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,可以给这个对象添加职责
  • Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致,并持有一个Component对象,即被装饰的对象

2. 示例

动态地给一个对象添加一些额外的职责

2.1 组件接口

public interface Person {
    void eat();
}

2.2 组件实现类

public class Student implements Person {
    @Override
    public void eat() {
        System.out.println("学生吃饭");
    }
}

2.3 装饰器父类

public abstract class Decorator implements Person {
    private Person person;
    public Decorator(Person person){this.person = person;}

    @Override
    public void eat() {
        person.eat();
    }
}

2.4 装饰器实现类

public class StudentDecoratorA extends Decorator {
    public StudentDecoratorA(Person person) {
        super(person);
    }

    @Override
    public void eat() {
        super.eat();
        drink();
    }

    public void drink(){
        System.out.println("学生喝牛奶");
    }
}

public class StudentDecoratorB extends Decorator {
    public StudentDecoratorB(Person person) {
        super(person);
    }

    @Override
    public void eat() {
        super.eat();
        drink();
    }

    public void drink(){
        System.out.println("学生喝豆浆");
    }
}

2.5 客户端

public class Client {
    public static void main(String[] args) {
        Student student = new Student();
        Person p = new StudentDecoratorA(student);
        p.eat();

        p = new StudentDecoratorB(student);
        p.eat();
    }
}

3. 优点

  • 比继承更灵活
    • 将功能分离到每个装饰器,然后通过对象组合的方式,在运行时动态地组合功能
  • 更容易复用功能
    • 一般一个装饰器只实现一个功能,一个对象可以增加多个装饰器,一个装饰器也可以装饰不同的对象
  • 简化高层定义
    • 高层只需要定义最基本功能,通过组合相应的装饰器来完成需要的功能

4. 缺点

  • 会产生很多细粒度的对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值