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

制作程序化装饰花纹图案

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

问题陈述:

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

意图:

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

解:

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

结构体

Decorator Design Pattern

装饰器设计模式结构

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

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

例:

Decorator Design Pattern Example

装饰器设计模式示例

在上面的示例中,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

制作程序化装饰花纹图案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10停止nginx命令 win_windows版nginx快速操控神器(重启,关闭)

众所周知,Windows 版本的Nginx 是linux版本的阉割版,但是在开发或者个人测试的时候,还是非常好用的,但是nginx运行的命令自己敲打起来不是那么的方便,因此呢,我们就写了个Bat批处理小程序,封装了这些命令,2.1版本您只需要配置下 N…

学习vi和vim编辑器(8):全局替换(1)

本章学习vi编辑器中的全局替换命令。通过全局替换命令,可以自动替换文件中所有出现过的某个单词。全局替换一般会用到两个ex命令:":g"(global),":s"(substitute)。 替换命令: 替换命令的语法如下&#xff1…

使用DynamoDBMapper查询DynamoDB项目

在上一篇文章中,我们使用底层Java api在DynamoDB数据库上发出了查询。 使用DynamoDBMapper进行查询非常简单。 使用哈希键发出查询非常简单。 这样的查询的最佳候选者是通过使用电子邮件哈希键进行搜索的Users表。 public User getUser(String email) {User user…

实训二—博客三

学期末总结 经过了一个学期的java学习,使我对java产生了很大的兴趣,虽然我学的并不怎么好,但是我喜欢程序可以成功运行时带来的成就感,我也享受排错的过程。学加练的上课模式我觉得也很棒,给了我们独立思考编程的时间&…

小肚皮最新版本_小肚皮旧版本

00后最炙手可热的社交软件《小肚皮旧版本》等你下载天,在这里独特的社交玩法等你感受,为你带来有趣的玩法乐趣,小肚皮旧版本中丰富的乐趣玩法等你来感受,让你轻松享受到更多的乐趣所在,为你带来不一样的社交乐趣。特色…

小心使用STL中map的[]操作符

一个map就是一个(关键码(key),值(value))对偶的序列,它提供基于关键码的快速提取操作。也就是说,可以用下标运算符[]将关键码作为下标去执行查找,并返回对应的…

存图

转载于:https://www.cnblogs.com/simple-huang/p/10183360.html

地平线机器人_地平线机器人CEO余凯:基于深度学习的自动驾驶之路

请关注公众号“汽车创新港”,获取后续更多论坛实录!加工作人员微信号:tinydanio,备注“我要入群”直接进入直播群!今天都是大牛,下面的也是技术大牛,是百度深度学习实验室创始人,百度…

Mac os下android studio模拟器无法联网解决方法

步骤1: https://blog.csdn.net/qq_33945246/article/details/79908298 步骤2: 访达进入/Users/文件夹 步骤3: shiftcmmand.显示隐藏文件夹 步骤4 打开.android文件夹 点击adv文件夹进入,然后回到 "步骤1"查看解决方法 本人创业做的一款androidApp, 下载量…

matlab中表示拉普拉斯分布_深度优化局部拉普拉斯金字塔滤波器。

微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识觉得文章有用,请戳底部【好看】支持算法概述基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究员Sylvain Paris(大神级人物,写了很多文章)提出的&#xff0c…

设计模式 命令模式 实例_根据您的命令-命令设计模式

设计模式 命令模式 实例命令设计模式是一种广为人知的设计模式,属于行为设计模式(“四人帮”的一部分)。 顾名思义,它与应用程序中的动作和事件有关。 问题陈述: 假设有一个网页将在其中包含多个菜单的情况。 编写此…

Linux(CentOS)挂载U盘、移动硬盘以及文件拷贝、备份

说明: 环境:VMware workstation 系统:centos6.2 以下操作均在root下执行的 1.U盘挂载 mkdir /mnt/usb //创建一个目录,用于挂载U盘 fdisk -l //查看系统中挂载的U盘,若系统有一块硬盘sdb1 代表你的U盘,…

iservice封装有哪些方法_5w大功率led白光灯珠参数,5w大功率led灯珠有哪些?

5w大功率led,5w大功率led白光灯珠参数,5w大功率led灯珠有哪些?5w大功率led,5w大功率led白光灯珠参数,5w大功率led灯珠有哪些?5w大功率led灯珠今天上午,一位台湾高雄的客户咨询定做5W大功率LED灯…

Java EE调度程序

Java EE应用程序服务器具有本机调度支持,并且在大多数应用程序中,不需要包括外部依赖项,例如著名的Quartz调度程序库。 Java EE 6和7完整配置文件中提供的Java EE 6计时器服务为我们提供了许多选项来定义调度间隔,以及如果停止并…

Simulink工作区无法保存To workspace模块的数据解决办法

1.首先要搞清楚Workspace概念。包括基本工作区(base workspace)和函数工作区。默认条件下在命令窗口中输入命令使用的是base workspace,但对于每个函数,都有自己独立的工作区。 2.GUI回调函数作为function有独立的工作区。 3.使…

对KVM虚拟机进行cpu pinning配置的方法

这篇文章主要介绍了对KVM虚拟机进行cpu pinning配置的方法,通过文中的各种virsh命令可进行操作,需要的朋友可以参考下首先需求了解基本的信息1 宿主机CPU特性查看 使用virsh nodeinfo可以看到一些基本信息 #virsh nodeinfo CPU model: x86_64 CPU(s): 32 CPU frequency: 1200 M…

1千条数据平均分配给15人_5项数据挂零!但5犯太吓人!CBA第1狠人场均干1人

昨天CBA常规赛第26轮:山东西王89-86北京首钢。上半场,双方打得非常激烈,比分交替领先。第3节北京抓住机会,顺势拉开比分(68-57)。李慕豪接方硕助攻,轻松扣篮得分。首钢替补席一片欢声笑语,方巨头和翟晓川笑…

redhat/centos 搭建svn服务器环境

subversion支持3种服务配置1、apache mod_dav_svn2、svnserve 3、穿越ssh隧道的svnserve教程选择的是最简单的svnserve的服务1、安装svnservyum install subversion2、建立一个仓库 respository$ mkdir /home/svn$ mkdir /home/code$ svnadmin create /home/svn/repository3、…

win10插入耳机没声音解决办法

之前重装了win10系统,装完系统后,发现插入耳机没有声音,非常令人难受!经过一番探索,终于解决了这个问题,在此与大家分享。 1.点击左下角搜索框,输入控制面板,点击enter打开 2.打开…

js如何获取服务器端时间?

用js做时间校正,获取本机时间,是存在bug的。 使用js也可获取到服务器时间,原理是使用 ajax请求,返回的头部信息就含有服务器端的时间信息,获取到就可以了。以下: 1、依赖jQuery 代码: function …