设计模式--装饰器模式

2024-06-23 09:12
文章标签 设计模式 装饰 模式

本文主要是介绍设计模式--装饰器模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地将行为添加到对象中,而无需通过子类进行静态扩展。装饰器模式通过创建一个包装类,也就是装饰器,来包裹原始的类,并且可以在包裹过程中添加一些额外的功能。

核心概念

装饰器模式的核心思想是通过组合而非继承来扩展对象的功能。它允许你在不改变原始类(被装饰者)结构的情况下,动态地添加功能。

结构

  1. Component(抽象构件)

    • 定义一个对象接口,可以给这些对象动态地添加职责。
  2. ConcreteComponent(具体构件)

    • 实现Component接口的具体对象,是被装饰的对象。
  3. Decorator(装饰器抽象类)

    • 持有一个Component对象的引用,并定义一个与Component接口一致的接口。
    • 可以通过构造方法传入Component对象,动态地给Component对象添加职责。
  4. ConcreteDecorator(具体装饰器)

    • 实现Decorator抽象类,负责向对象添加新的职责。
    • 可以在调用父类方法前后执行一些额外的动作,以达到特定的目的。

示例

考虑一个咖啡店的订单系统,客户可以选择不同种类的咖啡(例如:浓缩咖啡、深度烘焙咖啡),并且可以选择添加不同的配料(例如:牛奶、摩卡)来装饰咖啡。

1. 定义抽象组件
// Component: 咖啡接口
public interface Coffee {double getCost();  // 获取咖啡价格String getDescription();  // 获取咖啡描述
}

2. 定义具体组件

// ConcreteComponent: 浓缩咖啡
public class Espresso implements Coffee {@Overridepublic double getCost() {return 1.99;}@Overridepublic String getDescription() {return "Espresso";}
}// ConcreteComponent: 深度烘焙咖啡
public class DarkRoast implements Coffee {@Overridepublic double getCost() {return 2.49;}@Overridepublic String getDescription() {return "Dark Roast Coffee";}
}

3. 定义装饰器抽象类

// Decorator: 咖啡装饰器抽象类
public abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}@Overridepublic double getCost() {return decoratedCoffee.getCost();}@Overridepublic String getDescription() {return decoratedCoffee.getDescription();}
}

4. 定义具体装饰器类

// ConcreteDecorator: 牛奶装饰器
public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.5; // 添加牛奶的价格}@Overridepublic String getDescription() {return super.getDescription() + ", Milk"; // 添加牛奶的描述}
}// ConcreteDecorator: 摩卡装饰器
public class MochaDecorator extends CoffeeDecorator {public MochaDecorator(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.7; // 添加摩卡的价格}@Overridepublic String getDescription() {return super.getDescription() + ", Mocha"; // 添加摩卡的描述}
}

5. 客户端使用装饰器模式

public class DecoratorPatternExample {public static void main(String[] args) {// 点一杯浓缩咖啡Coffee espresso = new Espresso();System.out.println("Cost: $" + espresso.getCost() + ", Description: " + espresso.getDescription());// 加牛奶Coffee milkEspresso = new MilkDecorator(espresso);System.out.println("Cost: $" + milkEspresso.getCost() + ", Description: " + milkEspresso.getDescription());// 加摩卡Coffee mochaDarkRoast = new MochaDecorator(new DarkRoast());System.out.println("Cost: $" + mochaDarkRoast.getCost() + ", Description: " + mochaDarkRoast.getDescription());// 组合装饰:浓缩咖啡 + 牛奶 + 摩卡Coffee espressoWithMilkAndMocha = new MochaDecorator(new MilkDecorator(new Espresso()));System.out.println("Cost: $" + espressoWithMilkAndMocha.getCost() + ", Description: " + espressoWithMilkAndMocha.getDescription());}
}
6. 解释
  • 抽象组件 (Coffee 接口):定义了咖啡的基本行为。
  • 具体组件 (Espresso, DarkRoast 类):具体的咖啡类型,实现了 Coffee 接口。
  • 装饰器抽象类 (CoffeeDecorator 类):实现了 Coffee 接口,并持有一个 Coffee 对象的引用。
  • 具体装饰器类 (MilkDecorator, MochaDecorator 类):扩展了 CoffeeDecorator 类,添加了额外的行为。
  • 客户端 (DecoratorPatternExample 类):演示了如何动态地使用装饰器模式来装饰不同种类的咖啡,并组合不同的装饰器。

总结

装饰器模式允许动态地将责任附加到对象上,通过对象的组合,可以在运行时扩展功能。它避免了静态地使用子类来扩展功能的缺点,使得系统更加灵活和可扩展。在实际开发中,装饰器模式常用于需要动态地增加或修改对象功能的场景,例如界面组件的装饰、I/O流的过滤等。

这篇关于设计模式--装饰器模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086734

相关文章

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

flask 中使用 装饰器

因为要完成毕业设计,我用到fountain code做数据恢复。 于是在github上下载了fountain code的python原代码。 github上的作者用flask做了fountain code的demo。 flask是面向python的一个网站框架。 里面有用到装饰器。 今天笔试的时候,我也被问到了python的装饰器。

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

Builder模式的实现

概念 在创建复杂对象时,将创建该对象的工作交给一个建造者,这个建造者就是一个Builder。在日常的开发中,常常看到,如下这些代码: AlertDialog的实现 AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setMessage("你好建造者");builder.setTitle

[分布式网络通讯框架]----ZooKeeper下载以及Linux环境下安装与单机模式部署(附带每一步截图)

首先进入apache官网 点击中间的see all Projects->Project List菜单项进入页面 找到zookeeper,进入 在Zookeeper主页的顶部点击菜单Project->Releases,进入Zookeeper发布版本信息页面,如下图: 找到需要下载的版本 进行下载既可,这里我已经下载过3.4.10,所以以下使用3.4.10进行演示其他的步骤。

《分析模式》“鸦脚”表示法起源,Everest、Barker和Hay

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》这本书里面用的并不是UML表示法。作者Martin Fowler在书中也说了,该书写于1994-1995年,当时还没有UML。作者在书中用的是一种常被人称为“鸦脚”的表示法。  有的同学会有误解,例如有同学发表以下感想: “鸦脚”表示法当然不是Fowler先使用的。F

[最全]设计模式实战(一)UML六大原则

UML类图 UML类图是学习设计模式的基础,学习设计模式,主要关注六种关系。即:继承、实现、组合、聚合、依赖和关联。 UML类图基本用法 继承关系用空心三角形+实线来表示。实现接口用空心三角形+虚线来表示。eg:大雁是最能飞的,它实现了飞翔接口。 关联关系用实线箭头来表示。当一个类"知道"另一个类时,可以用关联。eg:企鹅需要"知道"气候的变化,需要"了解"气候规律。 聚合关