Java设计模式之装饰器模式

本文介绍了装饰器模式,一种在不改变对象本身的情况下,动态添加职责的设计模式。装饰器模式与继承相比提供了更灵活的扩展功能方式,避免了类层次的复杂性。同时,文章列举了装饰器模式的优缺点,并与代理模式进行了对比。通过一个实例展示了如何使用装饰器模式为Person类的drink方法添加冷饮装饰,使得Father、Mother和Child在喝水时可以添加冷饮效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰器模式,在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责。装饰器模式非常像继承特性,不改变父类,子类可扩展功能。
装饰器模式优点

  • 装饰类和被装饰类可以独立发展,不会相互耦合;
  • 相比于继承,更加的轻便、灵活;
  • 可以动态扩展一个实现类的功能,不必修改原本代码;

装饰器模式缺点

  • 会产生很多的装饰类,增加系统复杂性;
  • 容易出错,排错困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为繁琐;

装饰器模式和代理模式的区别

  • 代理是全权代理,目标根本不对外,全部由代理类来完成;装饰是增强,是辅助,目标仍然可以自行对外提供服务,装饰器只起增强作用;
  • 代理模式强调的是对代理的对象施加控制,但不对对象本身的功能进行增强;装饰器模式强调的是增强、新增行为;
  • 代理模式生效的是新的对象(代理对象);装饰器模式生效的对象还是原本的对象;

在这里插入图片描述
在这里插入图片描述
实例:定义一个Person接口,其实现类有Father、Mother、Child,实现Person接口中的drink方法,再定义一个装饰器类,实现Person接口,对drink方法进行装饰。好比喝水,对喝水方法进行添加点热水,然后再喝。

public interface Person {

    /**
     * 喝水
     */
    void drink();
}
public class Father implements Person {

    @Override
    public void drink() {
        System.out.println("father drink water");
    }
}
public class Mother implements Person {

    @Override
    public void drink() {
        System.out.println("mother drink water");
    }
}
public class Child implements Person {

    @Override
    public void drink() {
        System.out.println("child drink water");
    }
}
public class ColdDecorator implements Person {

    private Person person;

    public ColdDecorator(Person person) {
        this.person = person;
    }

    @Override
    public void drink() {
        System.out.println("decorator cold water...");
        person.drink();
    }
}
public class Test {

    public static void main(String[] args) {
        Person father = new Father();
        father = new ColdDecorator(father);
        father.drink();

        Person mother = new Mother();
        mother = new ColdDecorator(mother);
        mother.drink();

        Person child = new Child();
        child = new ColdDecorator(child);
        child.drink();

    }
}

测试结果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值