装饰者模式
场景
- 星巴克咖啡店
饮品
- 蒸馏咖啡
- 混合搅拌咖啡
如上的饮品都可以加 牛奶
、抹茶
等等:
装饰者模式定义
在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式
角色
抽象构件(Component)角色
定义一个抽象接口以规范准备接收附加责任的对象
具体构件(Concrete Component)角色
实现抽象构件,通过装饰角色为其添加一些职责
抽象装饰(Decorator)角色
继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能
具体装饰(ConcreteDecorator)角色
实现抽象装饰的相关方法,并给具体构件对象添加附加的责任
代码实现
定义饮品与品类
Beverage.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:34
* @description
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public abstract class Beverage {
private float price;
private String desc;
/**
* 成本
*
* @return float
*/
public abstract float cost();
}
HouseBlend.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:36
* @description
**/
public class HouseBlend extends Beverage {
public HouseBlend() {
super(30, "混合咖啡~");
}
@Override
public float cost() {
return getPrice();
}
}
Espresso.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:38
* @description
**/
public class Espresso extends Beverage {
public Espresso() {
super(20, "意大利咖啡~");
}
@Override
public float cost() {
return getPrice();
}
}
定义调味器装饰
Mocha.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:53
* @description
**/
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
super(beverage, 5, "抹茶");
}
@Override
public float cost() {
return getPrice() + getBeverage().cost();
}
@Override
public String getDesc() {
return super.getDesc() + getBeverage().getDesc();
}
}
Milk.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:42
* @description
**/
public class Milk extends CondimentDecorator {
public Milk(Beverage beverage) {
super(beverage, 5, "牛奶");
}
@Override
public float cost() {
return getPrice() + getBeverage().cost();
}
@Override
public String getDesc() {
return super.getDesc() + getBeverage().getDesc();
}
}
CondimentDecorator.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:39
* @description
**/
@EqualsAndHashCode(callSuper = true)
@Data
public abstract class CondimentDecorator extends Beverage {
private Beverage beverage;
public CondimentDecorator(Beverage beverage, float price, String desc) {
super(price, desc);
this.beverage = beverage;
}
}
使用如上所创建的类:
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:54
* @description
**/
public class Client {
public static void main(String[] args) {
Beverage espresso = new Espresso();
System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");
espresso = new Milk(espresso);
System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");
espresso = new Mocha(espresso);
System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");
}
}
UML 图
源码中应用
敬请期待
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具