当前位置: 首页 > news >正文

惠州企业建站程序/seo课程培训班

惠州企业建站程序,seo课程培训班,成都app开发制作,广州海珠做网站的公司设计模式-Decorator装饰器设计模式-Decorator装饰器角色优缺点适用场景装饰器模式与适配器模式的比较实现咖啡接口原味咖啡装饰器类具体的装饰器类添加牛奶添加糖客户端使用总结设计模式-Decorator装饰器 允许向一个现有的对象添加新的功能,同时又不改变其结构。这…

设计模式-Decorator装饰器

  • 设计模式-Decorator装饰器
  • 角色
  • 优缺点
  • 适用场景
  • 装饰器模式与适配器模式的比较
  • 实现
    • 咖啡接口
    • 原味咖啡
    • 装饰器类
    • 具体的装饰器类
      • 添加牛奶
      • 添加糖
    • 客户端使用
    • 总结

设计模式-Decorator装饰器

允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
​ 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活

角色

Component(抽象构件):给出一个抽象接口,装饰器模式中公共方法的类,在装饰器模式结构图的顶层,以规范准备接收附加责任的对象。
ConcreteComponent(具体构件):是要动态扩展的对象,转换器模式中具体的被装饰的类,它继承自Component。
Decorator(装饰器):持有一个构件(Component)对象的实例,它是装饰器模式中的核心对象,所有具体装饰器对象的父类,完成装饰器的部分职能。可以只对被装饰的对象进行一些简单的包裹,也可包含对Component中方法的实现。
ConcreteDecorator(具体装饰):完成具体的装饰功能。装饰功能的实现是通过调用被装饰对象对应的方法,加上装饰对象自身的方法。这是装饰器模式动机中的添加额外功能的关键。
在这里插入图片描述

优缺点

优点

  • 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
  • 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
  • 装饰模式允许系统动态决定“贴上”或者除掉一个“装饰”,继承关系是静态的,它在系统运行前就决定了;
  • 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合;
  • 装饰者类可以在被装饰者的行为前面或后面加上自己的行为,甚至取代被装饰者的行为,达到特定的目的;
  • 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

缺点

  • 多层装饰比较复杂。
  • 由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。

适用场景

  • 运行时,你需要动态地为对象增加额外职责时;
  • 当你需要一个能够代替子类的类,借助它提供额外方法时。
  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
  • 处理那些可以撤销的职责;
  • 当不能采用生成子类的方式进行扩充时。

装饰器模式与适配器模式的比较

共同点:都拥有一个目标对象。装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。
不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。适配器模式主要是为了接口的转换,而装饰者模式关注的是通过组合来动态的为被装饰者注入新的功能或行为(即所谓的责任)。

实现

假设我去买咖啡,首先服务员给我冲了一杯原味咖啡,我希望服务员给我加些牛奶和白糖混合入原味咖啡中。使用装饰器模式就可以解决这个问题。

咖啡接口

定义了获取花费和配料的接口。

/*** 咖啡接口*/
public interface Coffee {/*** 获取价格* @return*/public float getPrice();/*** 获取咖啡* @return*/public String getCoffee();
}

原味咖啡

实现Coffe接口,花费1元,配料中,只有咖啡

/*** 原味咖啡类*/
public class OriginalCoffee implements Coffee {@Overridepublic float getPrice() {return 1;}@Overridepublic String getCoffee() {return "原味咖啡";}
}

装饰器类

咖啡对象的装饰器类,同样实现Coffee接口,定义一个Coffe对象的引用,在构造器中进行初始化。并且将getPrice()和getCoffee()方法转发给被装饰对象。

/*** 咖啡的"装饰器",可以给咖啡添加各种"配料"* 该类是一个抽象类需要具体子类来实现*/
public class DecoratorAbstractCoffee implements Coffee {/*** 具体咖啡的接口*/protected final  Coffee coffee;/*** 构造方法,初始化咖啡对象的引用* @param coffee*/public DecoratorAbstractCoffee(Coffee coffee) {this.coffee = coffee;}/*** 获取价格,装饰器父类中直接转发"请求"至引用对象* @return*/@Overridepublic float getPrice() {return coffee.getPrice();}/*** 获取咖啡,装饰器父类中直接转发"请求"至引用对象* @return*/@Overridepublic String getCoffee() {return coffee.getCoffee();}
}

具体的装饰器类

添加牛奶

具体的装饰器类,负责往咖啡中“添加”牛奶,注意看getPrice()方法和getCoffee()方法,可以在转发请求之前或者之后,增加功能。如果是代理模式,这里的结构就有所不同,通常代理模式根据运行时的条件来判断是否转发请求。

/*** 混合牛奶到蜂蜜中*/
public class CreamCoffee extends DecoratorAbstractCoffee {private float price = (float) 0.5;/*** 调用父类的构造方法* @param coffee*/public CreamCoffee(Coffee coffee) {super(coffee);}/*** 增加配料需要加钱* @return*/@Overridepublic float getPrice() {return coffee.getPrice()+price;}/*** 对咖啡进行加工* @return*/@Overridepublic String getCoffee() {return coffee.getCoffee()+";添加牛奶";}
}

添加糖

另一个具体装饰器类,用来给咖啡加蜂蜜,一样的逻辑。

class HoneyCoffee extends DecoratorAbstractCoffee {private float price = (float) 1.4;public HoneyCoffee(Coffee coffee) {super(coffee);}@Overridepublic float getPrice() {return coffee.getPrice()+price;}@Overridepublic String getCoffee() {return coffee.getCoffee()+";添加蜂蜜";}
}

客户端使用

public class DecoratorMain {public static void main(String[] args) {//是不是很像 javaIO中的 stream流Coffee coffee = new CreamCoffee(new HoneyCoffee(new OriginalCoffee()));System.out.println(coffee.getCoffee());System.out.println(coffee.getPrice());}
}

总结

​ 装饰器模式是代替增加子类的一种解决方案,体现了聚合/合成复用原则的思想,尽量使用组合的方式来扩展功能,这样就把基本功能和扩展功能解耦了,使得代码可复用,可维护,灵活。关键点在于装饰器模式可以动态地为对象增加扩展功能。

http://www.lbrq.cn/news/1120663.html

相关文章:

  • wordpress编辑插件/seo门户网站
  • 一键优化为什么不能100/流程优化四个方法
  • 什么网站可以做公共基础知识/新闻20字摘抄大全
  • 谷歌seo网站建设/谷歌google搜索引擎入口
  • 郑州做网站公司排/全国疫情最新情况最新消息今天
  • 公司名字大全参考2023/石家庄百度seo排名
  • 摄影学习网站/800元做小程序网站
  • wordpress更改密码/seo系统培训
  • 中移建设有限公司官方网站/培训课程开发
  • 专业做旅游网站/免费发帖推广网站
  • 类似直播平台网站的建设费用/制作小程序的软件
  • 建设银行宁德分行网站/深圳网站关键词排名优化
  • 网站的后台系统怎么进入/宁德市医院
  • 我想做个网站怎么做 找谁做好/杭州seo排名优化
  • 互联网技术的发展/seo行业岗位
  • 个人网站做淘宝客商城/网站seo快速排名
  • 专做排版网站/深圳外贸网络推广渠道
  • 个人服务器搭建做网站/网络营销的主要推广方式
  • 做航空产品的网站有哪些/公司的seo是什么意思
  • 呼和浩特网站建设宣传/微信广告平台
  • 霞山网站开发公司/如何做市场推广方案
  • 怎么做网站dreamwave/新网站百度收录
  • 网上做网页网站任务赚钱/泰安网站建设优化
  • wordpress链接重建/网站seo 优化
  • 绍兴做网站选哪家/杭州百度竞价推广公司
  • wordpress 物流插件/东莞seo建站优化哪里好
  • 建行app怎么解除5000限额/公司排名seo
  • 佛山顺德做网站/关键词首页排名优化
  • wordpress请求接口的方式/百度seo优化收费标准
  • 在手机上做网站/深圳做网站的
  • Python 程序设计讲义(2):Python 概述
  • 如何把手机ip地址切换到外省
  • Ai问答之空间站星等
  • ZYNQ双核通信终极指南:FreeRTOS移植+OpenAMP双核通信+固化实战
  • ECUs、ZCUs、CCUs:产生的软件栈(SW stack)也有所不同
  • 常用的OTP语音芯片有哪些?