设计模式: 装饰器

装饰者模式:

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

注意事项

装饰者模式 VS 继承

目的都是为了要扩展对象的功能,装饰者模式可以提供比继承更多的灵活性

使用装饰着模式,相对于继承而言,需要的类的数目大大减少,再另一方面也会比继承产生更多的对象

使用场景

需要给一个现有类添加职责,但是又不能采用生成子类的方式去扩展的时候

当需要对于现有的一组基本功能进行组合,会产生非常多的功能的时候

当对象的功能要求可以同台的添加,或者说动态的撤销的时候

原理类图

角色分析

  • Component: 抽象主体、定义了一个主体的模板
  • ConcreteComponentA, B: 具体的主体,里面定义具体的业务逻辑
  • Decorator: 装饰者
  • ConcreteDecoratorA, B: 封装具体的装饰细节的实现类
java 复制代码
/**  
* @desc 抽象主体  
*/  
@Data  
public abstract class Coffee {  
  
private String desc;  
  
private float price;  
  
public abstract float cost();  
}  
  
/**  
* @desc 业务实体  
*/  
public class Cappuccino extends Coffee {  
  
public Cappuccino(){  
setPrice(12.2f);  
setDesc("卡布奇诺");  
}  
  
@Override  
public float cost(){  
System.out.println("当前价格为: " + getPrice());  
return getPrice();  
}  
}  
java 复制代码
  
/**  
* @desc 装饰器  
*/  
public class Decorator extends Coffee{  
  
private Coffee coffee;  
  
public Decorator(Coffee coffee){  
this.coffee = coffee;  
}  
  
// 重新计算方法: 递归实现  
@Override  
public float cost() {  
return super.getPrice() + coffee.cost();  
}  
  
@Override  
public String getDesc(){  
return super.getDesc() + coffee.getDesc();  
}  
}  
/**  
* @desc 装饰细节: 牛奶  
*/  
public class Milk extends Decorator {  
public Milk(Coffee coffee) {  
super(coffee);  
  
setDesc("加了一份牛奶,");  
  
setPrice(2.3f);  
}  
}  
  
/**  
* @desc 装饰器: 糖  
*/  
public class Sugar extends Decorator{  
public Sugar(Coffee coffee) {  
super(coffee);  
  
setDesc("加了份糖,");  
  
setPrice(1.5f);  
}  
}  
java 复制代码
/**  
* @desc 消费者  
*/  
public class CoffeeStore {  
  
  
public static void main(String... args){  
// 卡布奇诺, 1份牛奶,2份糖  
Coffee order = new Cappuccino();  
System.out.println("当前描述: " + order.getDesc() + " 当前价格: " + order.cost());  
  
order = new Milk(order);  
System.out.println("当前描述: " + order.getDesc() + " 当前价格: " + order.cost());  
  
order = new Sugar(order);  
order = new Sugar(order);  
System.out.println("当前描述: " + order.getDesc() + " 当前价格: " + order.cost());  
}  
}  
相关推荐
小徐Chao努力1 分钟前
Spring AI Alibaba A2A 使用指南
java·人工智能·spring boot·spring·spring cloud·agent·a2a
rannn_11111 分钟前
【Git教程】概述、常用命令、Git-IDEA集成
java·git·后端·intellij-idea
我家领养了个白胖胖11 分钟前
向量化和向量数据库redisstack使用
java·后端·ai编程
苹果醋322 分钟前
Java设计模式实战:从面向对象原则到架构设计的最佳实践
java·运维·spring boot·mysql·nginx
郑州光合科技余经理32 分钟前
实战分享:如何构建东南亚高并发跑腿配送系统
java·开发语言·javascript·spring cloud·uni-app·c#·php
yaoxin52112336 分钟前
273. Java Stream API - Stream 中的中间操作:Mapping 操作详解
java·开发语言·python
一念一花一世界40 分钟前
Arbess从基础到实践(25) - 集成GitLab+阿里云OSS实现Java项目自动化构建并将制品上传Aliyun OSS
java·阿里云·gitlab·cicd·arbess
liyi_hz200841 分钟前
企业信创落地深水区:O2OA(翱途)平台的国产化适配实践与技术思考
java·开源软件
她说..44 分钟前
手机验证码功能实现(附带源码)
java·开发语言·spring boot·spring·java-ee·springboot
guslegend1 小时前
第2节:项目性能优化(中)
架构