装饰器模式:动态给一个对象添加一些额外的职责
1.工厂模式:提供创建对象的接口2.单例模式:生成只存在一个的实例3.桥接模式:将类的功能层次和实现层次分离,动态结合4.享元模式:避免大量相同开销5.原型模式:通过复制生成实例6.建造者模式:组装复杂实例7.职责链模式:推卸责任8.模板模式:具体的步骤延迟到子类中实现9.迭代器模式:一个个遍历10.外观模式:隐藏了复杂系统的复杂性,并提供一个简单的接口来访问系统11.代理模式:为其他对象提供一种代理以控制对这个对象的访问12.适配器模式:将两个不兼容的类纠合在一起13.组合模式:处理树形结构数据
14.装饰器模式:动态给一个对象添加一些额外的职责
15.命令模式:命令也是类16.访问者模式:访问数据结构并处理数据17.观察者模式:发送状态变化通知18.状态模式:用类表示状态19.策略模式:整体替换算法20.解释器模式:语法规则也是类21.中介者模式:只有一个仲裁者22.备忘录模式:保存对象状态当我们想要在不改变原有对象的结构和功能的基础上,动态地给一个对象添加一些额外的行为或职责时,可以使用装饰器模式。
在装饰器模式中,通常会定义一个抽象装饰器类和具体的装饰器类。抽象装饰器类和被装饰对象实现同样的接口,而具体的装饰器类则包含了一个指向被装饰对象的引用,并且在其基础上增加了额外的行为或职责。
通过这种方式,我们可以在运行时动态地给一个对象添加所需要的行为或职责,而不必修改原有对象的结构或代码。同时,由于采用了组合的方式,我们可以灵活地对多个装饰器进行组合,以满足不同的需求。
装饰器模式广泛应用于Java中的IO流、Swing中的GUI组件等领域,也是Python中的装饰器(@decorator)机制的基础。
示例代码:
首先我们定义一个接口 Component
作为被装饰对象和抽象装饰器类的共同接口。
public interface Component { void operation(); }
然后定义一个具体的实现类 ConcreteComponent
:
public class ConcreteComponent implements Component { @Override public void operation() { System.out.println("执行具体操作"); } }
接下来定义一个抽象装饰器类 Decorator
:
public abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; } @Override public void operation() { component.operation(); } }
最后,我们定义一个具体的装饰器类 ConcreteDecorator
:
public class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } @Override public void operation() { super.operation(); addBehavior(); } private void addBehavior() { System.out.println("添加额外的行为"); } }
使用时,我们可以构造一个原有的 ConcreteComponent
对象,然后通过不断地用具体的装饰器类进行包装,来动态地给其添加额外的行为。例如:
Component component = new ConcreteComponent(); component.operation(); // 输出 "执行具体操作" Component decorator1 = new ConcreteDecorator(component); decorator1.operation(); // 输出 "执行具体操作",然后输出 "添加额外的行为" Component decorator2 = new ConcreteDecorator(decorator1); decorator2.operation(); // 输出 "执行具体操作",然后输出 "添加额外的行为",再次输出 "添加额外的行为"
在这个示例中,我们首先创建了一个 ConcreteComponent
对象,然后将其分别用 ConcreteDecorator
类进行包装。每一次包装都会动态地给原有对象添加额外的行为,并且不影响原有对象的结构和功能。
合集:
Java设计模式
分类:
Java设计模式 / 结构型模式
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性