当前位置: 首页 > 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子类,
http://www.dtcms.com/a/119290.html

相关文章:

  • 模拟考试系统(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 检查权限
  • C#核心学习(十二)面向对象--多态(1)virtual override和base三剑客
  • CExercise_07_1指针和数组_5检查一个整数数组是否是回文,即正序与倒序相同
  • 【C#知识点详解】LinkedList<T>储存结构详解
  • Spring Boot接口返回Long类型的数据时丢失精度的全局处理
  • LCR 131. 砍竹子 I
  • 什么是混合搜索Hybrid Search?
  • Python 小练习系列 | Vol.14:掌握偏函数 partial,用函数更丝滑!
  • 和DeepSeek聊高速公路定向广播
  • NO.79十六届蓝桥杯备战|数据结构-扩展域并查集-带权并查集|团伙|食物链|银河英雄传说(C++)
  • CesiumEarth v1.12 更新,支持安卓平板离线浏览3DTiles格式的三维倾斜模型