Java装饰者模式的示例详解

 更新时间:2022年02月25日 16:24:19   作者:温故知新之java  
装饰者模式:在不改变原有对象的基础之上,动态的将功能附加到对象上,提供了继承更有弹性的替代方案,也体现了开闭原则。本文将通过示例详细讲解一下装饰者模式,需要的可以参考一下

定义

装饰者模式:在不改变原有对象的基础之上,动态的将功能附加到对象上,提供了继承更有弹性的替代方案,也体现了开闭原则

案例

需求

一个人去咖啡店点了一杯卡布奇诺,加了一份热牛奶

方案

定义咖啡基类

public abstract class Coffee {
    private String desc;

    private float price;

    public abstract float cost();

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
}

定义卡布奇诺咖啡类,继承咖啡基类

public class Cappuccino extends Coffee{
    public Cappuccino(){
        setDesc("点了一杯卡布奇诺");
        setPrice(100);
    }

    @Override
    public float cost() {
        System.out.println("当前价格为:" + super.getPrice());
        return super.getPrice();
    }
}

定义装饰者类

public class Decorator extends Coffee{

    private Coffee coffee;

    public Decorator(Coffee coffee){
        this.coffee = coffee;
    }

    @Override
    public float cost() {
        return super.getPrice() + this.coffee.cost();
    }

    @Override
    public String getDesc() {
        return super.getDesc() + coffee.cost();
    }
}

定义热牛奶类

public class HotMilk extends Decorator {
    public HotMilk(Coffee coffee){
        super(coffee);
        setPrice(200);
        setDesc("点了一杯热牛奶");
    }
}

定义测试类

public class Test {
    public static void main(String[] args) {
        // 点了一杯卡布奇诺,还加了一份热牛奶
        Coffee coffee = new Cappuccino();
        System.out.println(coffee.getDesc());
        //System.out.println(coffee.getPrice());
        System.out.println(coffee.cost());;

        HotMilk hotMilk = new HotMilk(coffee);
        System.out.println(hotMilk.getDesc());
        //System.out.println(hotMilk.getPrice());
        System.out.println(hotMilk.cost());
    }
}

查看测试结果

分析

装饰者模式的目的也是为了扩展对象的功能,是继承的一个替代模式,可以动态的扩展一个实现类的功能,装饰类和被装饰类可以相互独立,不会耦合,灵活方便。

使用场景

  • 需要给一个现有类添加职责,但是有不能采用生成子类的方式去扩充的时候,
  • 当需要对于现有的一组基本功能进行组合,会产生非常多的功能的时候
  • 当对象的功能要求可以动态的添加,或者说的动态的撤销

知识点补充

装饰模式的定义和特点

在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。

就像我们做菜,需要用到调料,菜,刀,火等一系列抽象的组件来最终完成一道菜。

装饰模式的定义:

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。就增加功能来说,装饰模式比生成子类更加灵活。

特点:

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

缺点

装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

装饰模式的结构

装饰模式的结构一般包含以下几个角色

1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。

2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。

3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。

4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

到此这篇关于Java装饰者模式的示例详解的文章就介绍到这了,更多相关Java装饰者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解读thymeleaf模板引擎中th:if的使用

    解读thymeleaf模板引擎中th:if的使用

    这篇文章主要介绍了解读thymeleaf模板引擎中th:if的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • java单机接口限流处理方案详解

    java单机接口限流处理方案详解

    这篇文章主要为大家详细介绍了java单机接口限流处理方案,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring Boot外部化配置实战解析

    Spring Boot外部化配置实战解析

    这篇文章主要介绍了Spring Boot外部化配置实战解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 详解Java中的字节码增强技术

    详解Java中的字节码增强技术

    字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。本文将通过示例详细说说Java的字节码增强技术,需要的可以参考一下
    2022-10-10
  • Rocketmq事务消息之半消息详解

    Rocketmq事务消息之半消息详解

    这篇文章主要介绍了Rocketmq事务消息之半消息详解,RocketMQ的事务消息支持在业务逻辑与发送消息之间提供事务保证,RocketMQ通过两阶段的方式提供事务消息的支持,需要的朋友可以参考下
    2023-09-09
  • Java数据结构与算法之选择排序(动力节点java学院整理)

    Java数据结构与算法之选择排序(动力节点java学院整理)

    这篇文章主要介绍了Java数据结构与算法之选择排序的相关资料,本文通过代码讲解,非常不错,具有参考借鉴价值,需要的的朋友参考下
    2017-04-04
  • java数据结构与算法数组模拟队列示例详解

    java数据结构与算法数组模拟队列示例详解

    这篇文章主要为大家介绍了java数据结构与算法数组模拟队列示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • MyBatis批量插入/修改/删除MySql数据

    MyBatis批量插入/修改/删除MySql数据

    这篇文章主要给大家介绍了关于MyBatis批量插入/修改/删除MySql数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • java中xml进行报文发送和解析操作

    java中xml进行报文发送和解析操作

    这篇文章主要介绍了java中xml进行报文发送和解析操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • java对象转化成String类型的四种方法小结

    java对象转化成String类型的四种方法小结

    在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文就详细的介绍几种方法,感兴趣的可以了解一下
    2021-08-08

最新评论