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装饰者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Spring中的JavaConfig注解

    详解Spring中的JavaConfig注解

    在开发Java程序,尤其是Java EE应用的时候,总是免不了与各种配置文件打交道。java注解则帮我们使之更整洁,不会配置文件满天飞了。 下面这篇文章主要介绍了Spring中的JavaConfig注解,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • j2Cache线上异常排查问题解决记录分析

    j2Cache线上异常排查问题解决记录分析

    这篇文章主要为大家介绍了关于j2Cache线上异常排查的问题解决记录分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Springboot jar包远程调试详解

    Springboot jar包远程调试详解

    这篇文章主要为大家详细介绍了Springboot jar包远程调试,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 详细介绍Java阿里云的短信验证码实现

    详细介绍Java阿里云的短信验证码实现

    这篇文章主要介绍了详细介绍Java阿里云的短信验证码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • MyBatis Plus中InnerInterceptor的实现

    MyBatis Plus中InnerInterceptor的实现

    本文主要介绍了MyBatis Plus中InnerInterceptor的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • java实现从网上下载图片到本地的方法

    java实现从网上下载图片到本地的方法

    这篇文章主要介绍了java实现从网上下载图片到本地的方法,涉及java针对文件操作的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • Java判断时间段内文件是否更新的方法

    Java判断时间段内文件是否更新的方法

    这篇文章主要介绍了Java判断时间段内文件是否更新的方法,通过实例形式讲述了定时器、类加载器及线程等方法实现判断文件更新的功能,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • java实现微信企业付款到个人功能

    java实现微信企业付款到个人功能

    这篇文章主要为大家详细介绍了java实现微信企业付款到个人功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Java二叉树查询原理深入分析讲解

    Java二叉树查询原理深入分析讲解

    这篇文章主要介绍了Java二叉树查询原理,二叉查找树,又称二叉排序树,亦称二叉搜索树,是数据结构中的一类。在一般情况下,查找效率比链表结构要高
    2022-11-11
  • 解决配置Feign时报错PathVariable annotation was empty on param 0.

    解决配置Feign时报错PathVariable annotation was empty

    在配置Feign客户端时,如果遇到`@PathVariable`注解为空的问题,是因为在声明接口方法时没有为`@PathVariable`注解提供`value`属性,解决方法是为`@PathVariable`注解添加`value`属性,这样就可以避免报错,并成功启动Feign客户端
    2024-11-11

最新评论