制作程序化装饰花纹图案

装饰图案是广泛使用的结构图案之一。 此模式在运行时动态更改对象的功能,而不会影响对象的现有功能。 简而言之,此模式通过包装将附加功能添加到对象。

问题陈述:

想象一个场景,我们有一个比萨饼,已经用番茄和奶酪烤了。 之后,您只需要记住,您需要根据客户的选择添加一些其他浇头。 因此,您需要在旅途中再添加一些配料,例如鸡肉和胡椒粉。

意图:

动态地从对象中添加或删除其他功能或职责,而不会影响原始对象。
有时需要通过子类添加功能而无法添加功能,因为这可能会创建子类的负​​载。

解:

因此,在这种情况下,我们不是在使用继承为对象(例如披萨)添加其他功能,而是在使用合成。 当我们不想使用继承而是使用合成时,此模式很有用。

结构体

装饰器设计模式结构

以下是“装饰器设计”模式的参与者:

  • 组件 –这是包装程序,在运行时可以承担与其相关的其他职责。
  • 具体组件 –是添加了附加功能的原始对象。
  • 装饰器 -这是一个抽象类,其中包含对组件对象的引用,并且还实现了组件接口。
  • 具体的装饰器 -它们扩展装饰器并在Component类的顶部构建其他功能。

例:

装饰器设计模式示例

在上面的示例中,Pizza类充当Component,BasicPizza是需要装饰的具体组件。 PizzaDecorator充当Decorator抽象类,其中包含对Pizza类的引用。 ChickenTikkaPizza是ConcreteDecorator,它为Pizza类构建了附加功能。

让我们总结一下实现装饰器设计模式的步骤:

  • 创建一个我们要装饰的BasicPizza(混凝土组件)的接口。
  • 创建一个抽象类PizzaDecorator,其中包含Pizza(decorated)接口的引用字段。
  • 注意:装饰器(PizzaDecorator)必须扩展相同的装饰(Pizza)接口。
  • 现在,我们需要在decorator的构造函数中传递要装饰的Pizza对象。
  • 让我们创建混凝土装饰器(ChickenTikkaPizza),它应该提供附加浇头的附加功能。
  • Concrete Decorator(ChickenTikkaPizza)应该扩展PizzaDecorator抽象类。
  • 将装饰器(bakePizza())的方法重定向到装饰类的核心实现。
  • 覆盖需要更改行为的方法(bakePizza()),例如添加Chicken Tikka浇头。
  • 让客户端类通过在Concrete Component(BasicPizza)的帮助下创建Concrete Decorator(ChickenTikkaPizza)来创建Component type(Pizza)对象。
  • 简而言之,要记住:新组件=混凝土组件+混凝土装饰器

比萨披萨=新的ChickenTikkaPizza(新的BasicPizza());

代码示例:

BasicPizza.java

public String bakePizza() {return 'Basic Pizza';}

Pizza.java

public interface Pizza {public String bakePizza();
}

PizzaDecorator.java

public abstract class PizzaDecorator implements Pizza {Pizza pizza;public PizzaDecorator(Pizza newPizza) {this.pizza = newPizza;}@Overridepublic String bakePizza() {return pizza.bakePizza();}
}

ChickenTikkaPizza.java

public class ChickenTikkaPizza extends PizzaDecorator {public ChickenTikkaPizza(Pizza newPizza) {super(newPizza);}public String bakePizza() {return pizza.bakePizza() + ' with Chicken topping added';}
}

客户端程序

public static void main(String[] args) {Pizza pizza = new ChickenTikkaPizza(new BasicPizza());System.out.println(pizza.bakePizza());}

优点:

装饰器设计模式比标准继承提供了更大的灵活性。 继承还以静态方式扩展了父类责任。 但是,装饰器允许以动态方式执行此操作。

退税:

代码调试可能很困难,因为此模式会在运行时添加功能。

有趣的一点:

  • 适配器模式将不同的接口插入在一起,而装饰器模式则增强了对象的功能。
  • 与装饰器模式不同,策略模式无需更改即可更改原始对象。
  • 代理模式控制对对象的访问时,装饰器模式增强了对象的功能。
  • Composite和Decorator模式都使用相同的树结构,但是两者之间存在细微的差异。 当我们需要将具有相似行为的一组对象保留在另一个对象中时,可以使用复合模式。 但是,当我们需要在运行时修改对象的功能时,会使用装饰器模式。
  • Java API中有许多装饰器模式的实时示例。
    • java.io.BufferedReader;

如果我们看到BufferedReader的构造函数,那么我们可以看到BufferedReader通过添加更多功能(例如,在reader类中不存在的readLine())包装了Reader类。

关于客户端如何使用装饰器模式,我们可以使用与上述示例相同的格式。new BufferedReader(new FileReader(new File(“ File1.txt”)));

同样, BufferedInputStream是装饰对象FileInputStream的装饰器。

BufferedInputStream bs = new BufferedInputStream(new FileInputStream(new File(“ File1.txt”))));

参考: 四人帮–在Idiotechie博客上使用JCG合作伙伴 Mainak Goswami的装饰设计图案进行装饰 。

翻译自: https://www.javacodegeeks.com/2012/12/decorate-with-decorator-design-pattern.html

制作程序化装饰花纹图案

制作程序化装饰花纹图案_用装饰器设计图案装饰相关推荐

  1. HTML+CSS+JS零食官网网站设计——美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业

    HTML5期末大作业:零食官网网站设计--美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期 文章目录 HTML5期末大作业:零食官网网站设计--美食零食官网(6页) html网 ...

  2. HTML5期末大作业:零食官网网站设计——美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业

    HTML5期末大作业:零食官网网站设计--美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. ...

  3. HTML5期末大作业:棕色蛋糕甜品网站设计——棕色蛋糕甜品店(4页) 美食甜品网页制作期末大作业成品_生鲜水果网页设计期末作业

    HTML5期末大作业:棕色蛋糕甜品网站设计--棕色蛋糕甜品店(4页) 美食甜品网页制作期末大作业成品_生鲜水果网页设计期末作业 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. ...

  4. html网页制作期末大作业成品_新疆旅游网页设计作品_dreamweaver作业静态HTML网页设计模板_新疆旅游景点网页作业制作

    html网页制作期末大作业成品_新疆旅游学生网页设计作品_dreamweaver作业静态HTML网页设计模板_新疆旅游景点网页作业制作 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到 ...

  5. 【Midjourney】Midjourney Prompt 提示词 ④ ( 纹身设计 | 建筑设图案 | 照片级真实性图像 | 玻璃窗设计图案 | 使用 Blender 制作的 3D 图像 )

    文章目录 一.tattoo 提示词 - 纹身设计 二.architecture / interior design 提示词 - 建筑设图案 三.photorealistic 提示词 - 照片级真实性图 ...

  6. python用双重循环输出菱形图案_使用循环创建菱形图案

    以下几点怎么样:side = int(input("Please input side length of diamond: ")) for x in list(range(sid ...

  7. python制作购物网站开题报告_网上商城的设计与实现开题报告

    篇一:网上购物系统的开题报告 本科毕业论文(设计)开题报告 论 文 题 目: 网上购物系统的实现 学 院: 专 业 .班 级:计算机科学与技术 学 生 姓 名: 指导教师(职称): 2013年 **月 ...

  8. python制作购物网站开题报告_购物网站的设计与实现开题报告

    学 院 专 业 姓 名 学号 报告日期 论文(设计)题目 购物网站的设计与实现 指导教师 论文 (设计) 起止时间 一. 论文(设计)研究背景与意义 背景 : 随着时代的发展, 科学技术的进步和网络的 ...

  9. 学生网站模板棕色蛋糕甜品网站设计——棕色蛋糕甜品店(4页) 美食甜品网页制作期末大作业成品_生鲜水果网页设计期末作业

    HTML5期末大作业 文章目录 HTML5期末大作业 一.作品展示 二.文件目录 三.代码实现 四.获取更多源码 一.作品展示 二.文件目录 三.代码实现 <!DOCTYPE html> ...

最新文章

  1. 图解Transformer(完整版)!
  2. 北京智源行动计划发布,北京智源人工智能研究院揭牌成立
  3. 学生、课程、分数的设计(重要)
  4. C#相关的DateTime操作
  5. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to
  6. 又是Dropout两次!这次它做到了有监督任务的SOTA
  7. php使用jasperreport,php-报表引擎指南(Pentaho,JasperReports,BIRT)
  8. sql中exits和in的区别
  9. 设计模式C++实现_2_简单工厂模式
  10. Qt仿win7自动顶部最大化左侧右侧半屏效果
  11. 生物学家、钢管舞、全栈工程师,女程序员如何活得漂亮
  12. python生成一组随机数_python怎么产生不重复的随机数
  13. 第一次使用vim遇到的问题及常用方法
  14. VirtualBox安装增强功能时报错:未能加载虚拟光盘VBoxGuestAdditions.iso 到虚拟电脑
  15. 管程由哪三部分组成_换热器是几壳程?几管程的?
  16. React.js小书
  17. android仿ios消息框,Android仿IOS提示框
  18. Apache DolphinScheduler 3.0 正式版重磅发布
  19. 其实特简单,Python 做一个漂亮女孩词云跳舞的视频
  20. MoviePy - 中文文档4-MoviePy实战案例-追踪人脸,打马赛克

热门文章

  1. Java中的函数传递
  2. Tomcat Get请求的巨坑
  3. java之正则表达式
  4. ssm使用全注解实现增删改查案例——IEmpService
  5. java实现邮件发送准备工作(前期配置)
  6. StringBuilder的使用
  7. 处理目录的常用命令---Linux
  8. SpringCloud Config 分布式配置
  9. MyBatis-Plus EntityWrapper的使用 wrapper le ge
  10. win10硬盘修复工具使用教程