java 设计模式之装饰器模式学习
介绍
装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使
用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
装饰器UML图如下
1、 组件(component): 定义了全部组件类和装饰器类的行为。
2、装饰器抽象类(decorator):实现了component接口的抽象类,封装了一个被修饰的component对象。
3、组件实现类(ConcreteComponent): 实现 Component 接口,组件实现类就是被装饰器装饰的原始对象,新功能或者附加功能都是通过装饰器添加到该类的对象上的
4、具体装饰器类(ConcreteDecorator):该实现类要向被装饰的对象添加某些功能
代码实现
假如有这么一个需求,你女朋友想要和红豆奶茶,然后她还想喝珍珠奶茶,还想要燕麦的,总不能点三杯把,这个时候装饰器模式就用上了。
代码如下:
组件类 MilkyTea:
/**
* 组件:定义了全部组件类和装饰器实现的行为
*/
public interface MilkyTea {
/**
* 喝奶茶
*/
String drink();
}
装饰器抽象类 MilkyTeaDecorator:
public abstract class MilkyTeaDecorator implements MilkyTea{
private MilkyTea milkyTea;
public MilkyTeaDecorator(MilkyTea milkyTea) {
this.milkyTea = milkyTea;
}
@Override
public String drink() {
return milkyTea.drink();
}
}
组件实现类 RedBeanMilkyTea :
/**
* 组件实现类
*/
public class RedBeanMilkyTea implements MilkyTea {
@Override
public String drink() {
return "红豆奶茶 ";
}
}
具体装饰器类:
public class AddPearl extends MilkyTeaDecorator{
public AddPearl(MilkyTea milkyTea) {
super(milkyTea);
}
@Override
public String drink() {
return super.drink() + " + 珍珠";
}
}
public class AddOat extends MilkyTeaDecorator{
public AddOat(MilkyTea milkyTea) {
super(milkyTea);
}
@Override
public String drink() {
return super.drink()+" + 麦片";
}
}
测试类:
public class MilkTeaDemo {
public static void main(String[] args) {
MilkyTea redBean = new RedBeanMilkyTea();
// 加燕麦
redBean = new AddOat(redBean);
System.out.println(redBean.drink());
// 加奶茶
redBean = new AddPearl(redBean);
System.out.println(redBean.drink());
}
}
结果:
红豆奶茶 + 麦片
红豆奶茶 + 麦片 + 珍珠
总结
装饰器相对于继承,装饰器模式灵活性更强,扩展性更强:
1、灵活性:装饰器模式将功能切分成一个个独立的装饰器,在运行期可以根据需要动态的添加功能,甚至对添加的新功能进行自由的组合;
2、扩展性:当有新功能要添加的时候,只需要添加新的装饰器实现类,然后通过组合方式添加这个新装饰器,无需修改已有代码,符合开闭原则;
能力有限,水平一般,如有错误,请多指教
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端