当前位置: 首页 > news >正文

java设计模式-装饰者模式

装饰者模式(Decorator)

在这里插入图片描述

定义
1、动态的将新功能附加到对象上,在对象功能扩展方面,他比继承更有弹性,也体现了开闭原则(OCP)
2、这里提到的动态的将新功能附加到对象和OCP原则,在后面应用实际上会以代码的形式体现。

//=====================饮料========================
// 饮料
@Data
public abstract class Drink {
    //描述
    public  String description;
    //价格
    private float price=0.0f;
    //计算费用的抽象方法
    //子类去实现
    public abstract float cost();
}
public class Coffee extends Drink {
    @Override
    public float cost() {
        return super.getPrice();
    }
}
public class EspressoCoffer extends Coffee {
    public EspressoCoffer() {
        setDescription("意大利咖啡");
        setPrice(6.0f);
    }
}
public class LongBlackCoffer extends Coffee {
    public LongBlackCoffer() {
        setDescription("美式咖啡");
        setPrice(5.0f);
    }
}
public class DecafCoffee extends Coffee {
    public DecafCoffee() {
        setDescription(" 无因咖啡 ");
        setPrice(1.0f);
    }
}
public class ShortBlackCoffer extends Coffee {
    public ShortBlackCoffer() {
        setDescription(" short Black coffer");
        setPrice(5.6f);
    }
}
//===================装饰者类==========================

/**
 * 装饰者
 *
 * @author Administrator
 * @description
 */
public class Decorator extends Drink {
    private Drink obj;
    //组合
    public Decorator(Drink obj) {
        this.obj = obj;
    }
    @Override
    public float cost() {
        //自己的价格 + drink的价格
        return super.getPrice() + obj.cost();
    }
    @Override
    public String getDescription() {
        //输出了被装饰者的信息
        return super.description + "" + super.getPrice() + " && " + obj.getDescription();
    }
}
//巧克力
public class ChocolateDecorator extends Decorator {
    public ChocolateDecorator(Drink obj) {
        super(obj);
        setDescription(" 巧克力 ");
        //调味品的价格
        setPrice(3.0f);
    }
}
//牛奶调味品
public class MilkDecorator extends Decorator {
    public MilkDecorator(Drink obj) {
        super(obj);
        setDescription(" 牛奶 ");
        setPrice(2.0f);
    }
}
//豆浆
public class SoyDecorator extends Decorator {
    public SoyDecorator(Drink obj) {
        super(obj);
        setDescription(" 豆浆 ");
        setPrice(1.5f);
    }
}
//====================调用=============================
@Slf4j
public class CofferBarClient {
    public static void main(String[] args) {
        //装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack

        //1、点一份LongBlack
        Drink order=new LongBlackCoffer();
        log.info("费用1:{}",order.cost());
        log.info("描述1:{}",order.getDescription());

        //order加一分牛奶
        order=new MilkDecorator(order);
        log.info("费用1:{}",order.cost());
        log.info("描述1:{}",order.getDescription());
        //order 加一分巧克力
        order=new ChocolateDecorator(order);
        log.info("费用1:{}",order.cost());
        log.info("描述1:{}",order.getDescription());
        //order 加一分巧克力
        order=new ChocolateDecorator(order);
        log.info("费用1:{}",order.cost());
        log.info("描述1:{}",order.getDescription());

        log.info("=======================================");

        Drink order2=new DecafCoffee();
        log.info("费用2:{}",order2.cost());
        log.info("描述2:{}",order2.getDescription());

        order2=new ChocolateDecorator(order2);
        log.info("费用2:加入一份巧克力{}",order2.cost());
        log.info("描述2:加入一份巧克力{}",order2.getDescription());
    }
}
  • 输出信息
描述1:美式咖啡
费用1:7.0
描述1: 牛奶 2.0 && 美式咖啡
费用1:10.0
描述1: 巧克力 3.0 &&  牛奶 2.0 && 美式咖啡
费用1:13.0
描述1: 巧克力 3.0 &&  巧克力 3.0 &&  牛奶 2.0 && 美式咖啡
=======================================
费用2:1.0
描述2: 无因咖啡 
费用2:加入一份巧克力4.0
描述2:加入一份巧克力 巧克力 3.0 &&  无因咖啡 

源码中的使用(InputStream)
在这里插入图片描述

public abstract class InputStream implements Closeable{}//是一个抽象类,即Component
public class FilterInputStream extends InputStream{//是一个装饰者类Decorator
    protected volatile InputStream in //被装饰的对象 }
class DataInputStream extends FilterInputStream implements DataInput{//FilterInputStream子类,

相关文章:

  • 模拟考试系统(ssm+vue+mysql5.x)
  • 实验一 单管共射极放大电路
  • nps端口被占用
  • 高级java每日一道面试题-2025年3月26日-微服务篇[Nacos篇]-在Spring Cloud项目中如何集成Nacos?
  • 1. 三带一
  • 质数质数筛
  • Linux操作系统的计算机体系结构与网络安全的深度关联
  • 基于Resemblyzer 声纹识别门禁系统设计
  • 有效压缩 Hyper-v linux Centos 的虚拟磁盘 VHDX
  • 密码破解工具
  • 蓝桥杯-小明的彩灯(差分)
  • 【网络安全 | 漏洞挖掘】通过分析JS文件实现接口未授权访问与账户接管
  • MicroPython 开发ESP32应用教程 之 Timer、GPIO中断
  • OpenCV图像平滑处理方法详解
  • X 进制减法
  • C++-ffmpeg-2-3-工厂模式封装SDL-9-7
  • Qt上hook钩子的使用,监测键盘和鼠标。
  • Crow介绍及使用
  • 一文了解亿级数据检索:RedisSearch
  • OpenBMC:BmcWeb 处理http请求5 检查权限
  • 网站开发任务单百度文库/成人短期技能培训学校
  • 小程序数据库怎么建立/小红书seo排名帝搜软件
  • 什么网站专做外贸/关键词数据分析工具有哪些
  • 做logo有哪些网站/重庆网络seo
  • 有什么网站可以做数学题/做电商必备的几个软件
  • 专业集团门户网站建设方案/seo排名优化点击软件有哪些