装饰者模式

定义:
动态的向一个现有的对象添加新的功能,同时又不改变其结构。它属于结构型模式。
优点:
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功 能。
缺点:
多层装饰比较复杂。

装饰者模式案例

案例:结算价格计算,根据不同价格嵌套运算

订单结算价格实战

在订单提交的时候,订单价格和结算价格其实是两码事,订单价格是当前商品成交价格,而结算价格是用户最终需要支付的金额,最终支付的金额并不是一成不变,它也并不是商品成交价格,能改变结算价格的因素很多,比如满100 减10元,VIP用户再减5块。订单结算金额计算我们就可以采用装饰者模式。

装饰者模式价格运算实现

实现思路分析:

1、创建接口(MoneyOperation),定义订单价格计算,因为所有价格波动,都是基于订单价格来波动的。
2、创建订单价格计算类(OrderPayMoneyOperation),实现MoneyOperation接口,实现订单价格计算。
3、创建装饰者对象(Decorator),以供功能扩展。
4、实现优惠券优惠金额计算功能扩展,创建Decorator的扩展类CouponsMoneyOperation,先计算订单金额,再计算优惠 券使用之后的优惠金额。
5、实现金币抵现功能扩展,创建Decorator的扩展类GoldMoneyOperation,先计算订单金额,再实现金币优惠之后的金 额。

  • 基础接口:创建接口 MoneyCal ,该接口只用于定义计算订单金额的方法。
@Component
public interface MoneyCal {public void money(Order order);
}
  • 订单金额计算类:创建类 MoneyCalImpl实现订单金额的计算。
@Component
public class MoneyCalImpl implements MoneyCal{@Overridepublic void money(Order order) {System.out.println("开始计算金额");}
}
  • 装饰者类:创建装饰者类 DecorateMoney 供其他类扩展。
public abstract class DecorateMoney implements MoneyCal{//被扩展的对象private MoneyCal moneyCal;public void setMoneyCal(MoneyCal moneyCal) {this.moneyCal = moneyCal;}@Overridepublic void money(Order order) {moneyCal.money(order);}
}
  • 满减元价格计算:创建类 FullMoney扩展装饰者类,实现满减价格计算。
@Component
public class FullMoney extends DecorateMoney {@Overridepublic void money(Order order) {super.money(order);fullMoney(order);}public void fullMoney(Order order){System.out.println("计算满减金额");}
}
  • VIP优惠价格计算:创建类 VipMoney,实现VIP优惠计算。
@Component
public class VipMoney extends DecorateMoney {@Overridepublic void money(Order order) {super.money(order);vipMoney(order);}public void vipMoney(Order order){System.out.println("计算VIP金额");}
}
  • 支付金额计算:创建TestMoney测试类。
public class TestMoney {public static void main(String[] args) {MoneyCal moneyCal = new MoneyCalImpl();DecorateMoney fullMoney = new FullMoney();fullMoney.setMoneyCal(moneyCal);DecorateMoney vipMoney = new VipMoney();vipMoney.setMoneyCal(fullMoney);vipMoney.money(null);}
}
  • 测试效果:
开始计算金额
计算满减金额
计算VIP金额

深入浅出设计模式---6、装饰者模式相关推荐

  1. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  2. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  3. 前端也要学系列:设计模式之装饰者模式

    什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...

  4. 设计模式 之 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对 ...

  5. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )

    文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...

  6. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  7. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

  8. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

  9. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  10. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

最新文章

  1. js如何将数据放在一个内置窗口里面_Java 爬虫遇上数据异步加载,试试这两种办法!...
  2. 三菱fx2n64mr说明书_三菱FX2N可编程控制器使用手册
  3. NS2仿真:公交车移动周期模型及性能分析
  4. 干得累死,并不见得老板就待见你?
  5. linux临时文件创建失败,-bash: 无法为立即文档创建临时文件: 设备上没有空间
  6. Java Web开发技术教程入门-JavaBean组件与Servlet
  7. 在html中不显示内容是,网页中显示的内容在源文件中找不到是什么原因_html/css_WEB-ITnose...
  8. matlab散点图与colorbar,MATLAB如何为图像做colorbar
  9. java递归查询无限极分类_sqlserver实现树形结构递归查询(无限极分类)的方法
  10. install ubuntu from a usb disk
  11. apache 建立用户认证
  12. linux 扫描媒体库,如何扫描出Android系统媒体库中视频文件
  13. Vue 引入 zepto
  14. 【常规版本】SIS-OAS 1.53.0(2019/5/23发布)版本 --需求评审 ---模板
  15. 一寸照片多大?你知道一寸照片的尺寸吗?
  16. java经纬度凸包graham_凸包算法(Graham扫描法)详解
  17. GEE|假彩色目视解译山东省玉米、水稻、小麦等样本集制作代码
  18. python运行excel宏_从python运行excel宏
  19. HLOJ 2026 猴子吃桃
  20. vbs小游戏(猜字谜)

热门文章

  1. GD32(6)中文字库
  2. 达内java考试_达内第一次JAVA考试题
  3. 大一java题库及答案_2016最新java考试题库及答案
  4. KEmulator 屏蔽内存查看器功能
  5. 阿里巴巴 EasyExcel (web版) 上传与下载(超详细) Excel上传下载
  6. 农行笔试编程题(Java)记录
  7. 使用VSCode创建Java项目
  8. 手机型号大全_《华为手机型号大全》值得收藏
  9. SoapUI安装教程,亲测可用
  10. 用户启动计算机并登录win7,win7电脑设置开机登录界面的方法?