设计模式——装饰者模式(Decorator)

news/2024/11/10 15:11:24/

装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活。在装饰者模式中,一个装饰类会包装一个对象(通常称为被装饰者),并为其添加一些新的功能。

装饰者模式包含以下几个角色:

  1. Component(抽象组件):定义一个对象接口,可以给这些对象动态地添加职责。
  2. ConcreteComponent(具体组件):实现Component接口,是装饰器可以装饰的对象。
  3. Decorator(抽象装饰器):继承自Component,持有对Component对象的引用,并定义与Component接口一致的接口。
  4. ConcreteDecorator(具体装饰器):实现Decorator接口,负责给Component添加职责。

装饰者模式的特点:

  • 装饰者和被装饰者对象有相同的超类型(接口或者抽象类)。
  • 你可以用一个或多个装饰者包装一个对象。
  • 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
  • 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

以下是一个简单的Java装饰者模式示例:

// 抽象组件(Component)
public interface Component {void operation();
}// 具体组件(ConcreteComponent)
public class ConcreteComponent implements Component {@Overridepublic void operation() {System.out.println("执行基础操作");}
}// 抽象装饰器(Decorator)
public abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {if (component != null) {component.operation();}}
}// 具体装饰器A(ConcreteDecoratorA)
public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedFunctionA();}public void addedFunctionA() {System.out.println("为操作添加功能A");}
}// 具体装饰器B(ConcreteDecoratorB)
public class ConcreteDecoratorB extends Decorator {public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedFunctionB();}public void addedFunctionB() {System.out.println("为操作添加功能B");}
}// 客户端(Client)
public class Client {public static void main(String[] args) {Component component = new ConcreteComponent();// 使用装饰器A包装ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(component);decoratorA.operation(); // 执行基础操作,并添加功能A// 使用装饰器B包装装饰器AConcreteDecoratorB decoratorB = new ConcreteDecoratorB(decoratorA);decoratorB.operation(); // 执行基础操作,添加功能A,并再添加功能B}
}

在这个例子中,ConcreteComponent是具体组件,它实现了Component接口中的operation()方法。Decorator是抽象装饰器,它持有一个Component对象的引用,并提供了operation()方法的默认实现,即调用被装饰者的operation()方法。ConcreteDecoratorAConcreteDecoratorB是具体装饰器,它们分别添加了不同的功能(addedFunctionA()addedFunctionB())。在客户端代码中,你可以看到如何使用装饰器来动态地给对象添加职责。


http://www.ppmy.cn/news/1460760.html

相关文章

LeetCode 每日一题 ---- 【2960.统计已测试设备】

LeetCode 每日一题 ---- 【2960.统计已测试设备】 2960.统计已测试设备方法:模拟数组 2960.统计已测试设备 方法:模拟数组 简单的模拟题,遍历数组,暴力的话就是两次遍历第一次从 0 到 n - 1,判断 batteryPercentages…

【刷题】一篇文章搞定“位运算”

只要春天不死,就有迎春的花朵年年岁岁开放,生命讲涅槃,生生不息,并会以另一种形式永存。 – 路遥 《平凡的世界》 (◦′ᆺ‵◦) ♬ ✧❥✧.•✧♡✧ ℒℴѵℯ ✧♡✧•.❥ (◦′ᆺ‵◦) ♬ ✧❥✧.•✧♡✧ ℒℴѵℯ ✧♡✧•.❥…

代码大师的工具箱:现代软件开发利器

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

漫威争锋Marvel Rivals怎么搜索 锁区怎么搜 游戏搜不到怎么办

即将问世的《漫威争锋》(Marvel Rivals)作为一款万众期待的PvP射击游戏新星,荣耀携手漫威官方网站共同推出。定档5月11日清晨9时,封闭Alpha测试阶段将正式揭开序幕,持续时间长达十天之久。在此首轮测试窗口&#xff0c…

生成ssh来连接git

生成SSH密钥: 打开你的命令行终端(如Windows的CMD、PowerShell,或者Linux/Mac的Terminal)。 运行以下命令来生成SSH密钥对(私钥和公钥): ssh-keygen -t rsa -b 4096 -C "your_emailexampl…

Spring Boot集成Druid快速入门Demo

1.什么是Druid? Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。 2.mysql环境搭建 第一个mysql数…

Gartner发布准备应对勒索软件攻击指南:勒索软件攻击的三个阶段及其防御生命周期

攻击者改变了策略,在某些情况下转向勒索软件。安全和风险管理领导者必须通过提高检测和预防能力来为勒索软件攻击做好准备,同时还要改进其事后应对策略。 主要发现 勒索软件(无加密的数据盗窃攻击)是攻击者越来越多地使用的策略。…