装饰模式定义:

装饰模式就是动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

装饰模式实现:

需求:净水器公司想要搞一波营销活动,买送净水机送三种礼品:鸡蛋,雨伞,洗菜盆,但是销售比较鸡贼这三种礼品不是必须都送的,会根据消费者的购买意愿来由销售来送几种礼品。

设计思路:实现抽象的Gift类是原始对象,有giveGift方法;SaleGift类是最核心的类,必须会执行也是需要装饰的类;Decorator类是装饰的抽象类,GiftDecorator1和GiftDecorator2是具体的装饰类。

类图:

代码实现:

/*** 装饰模式* 礼品抽象类*/
public abstract class Gift {protected  abstract  void giveGift();
}/*** 销售礼品*/
public class SaleGift  extends Gift {@Overrideprotected void giveGift() {System.out.println("只要下单就送鸡蛋");}}/*** 装饰器模式*装饰抽象类*/
public abstract class Decorator  extends  Gift{private Gift gift;//需要装饰的类public Decorator(Gift gift){this.gift = gift;}@Overrideprotected void giveGift() {this.gift.giveGift();}
}/*** 装饰器模式* 装饰类1*/
public class GiftDecorator1 extends Decorator{//被修饰的对象public GiftDecorator1(Gift gift) {super(gift);}//自己的装饰方法private void giveSalfGift(){System.out.println("再送一把天堂伞");}//重写父类方法protected void giveGift() {super.giveGift();giveSalfGift();}
}
/*** 装饰器模式* 装饰类2*/
public class GiftDecorator2 extends Decorator{//被修饰的对象public GiftDecorator2(Gift gift) {super(gift);}//自己的装饰方法private void giveSalfGift(){System.out.println("再送一套不锈钢盆");}//重写父类方法protected void giveGift() {super.giveGift();giveSalfGift();}
}/*** 装饰器模式* 测试场景*/
public class TestDecorator {public static void main(String[] args) {System.out.println("开始销售净水机========");Gift gift = new SaleGift();gift.giveGift();System.out.println("购买意愿的不够强烈=========");//第一次修饰gift = new GiftDecorator1(gift);gift.giveGift();System.out.println("开始犹豫==========");// 第二次修饰gift  = new GiftDecorator2(gift);gift.giveGift();System.out.println("最终销售成功===========");}
}//执行结果开始销售净水机========
只要下单就送鸡蛋
购买意愿的不够强烈=========
只要下单就送鸡蛋
再送一把天堂伞
开始犹豫==========
只要下单就送鸡蛋
再送一把天堂伞
再送一套不锈钢盆
最终销售成功===========

SaleGift类最终被装饰了两次,每次装饰都是在原有的核心功能上加上了装饰类特有的处理方法。而装饰模式最根本的原理每次进行装饰时传入的构造方法的调用父类的构造方法进行初始化。而无论的装饰类还是核心类都继承Gift的子类。所以装饰模式其实时利用继承的特性,而又丰富了继承的一种手段。

总结:

装饰模式是为了解决继承关系过于复杂的场景,通过组合来代替继承,增强原有类的功能,装饰模式还可以通过多个装饰器来装饰,不过装饰器类需要继承和被装饰类的相同的类或者接口。

  • 装饰模式的优点:首先装饰类和被装饰类是可以独立发展的,没有耦合关系。装饰模式是继承关系的一种替代产品,因为装                               饰类最终继承的也原始类。而被装饰类也是如此。但是装饰模式的比继承可扩展性要高,而且更灵活。
  • 装饰模式的缺点:装饰模式的装饰层数不宜过多,过多的装饰效果会是代码像剥洋葱一样,同时代码不容维护和调试。
  • 适用场景:           当需求变更时,在原有功能上增加附属功能时,在保证原有功能的基础上,不妨试试装饰模式。

参考《设计模式之禅》秦小波著

设计模式学习之—我是一个粉刷匠(装饰模式)相关推荐

  1. nefu 984 我是一个粉刷匠

     其实刚开始我也没想出来,后来看了其他大神的描述终于明白了,其实就是把每一行每一列遍历一遍. description 小明最近在粉刷墙壁,他家的墙壁正好贴了8*8块瓷砖,可惜这些瓷砖都是白色的,小 ...

  2. 步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)

    概述 在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性:并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多 ...

  3. 设计模式学习笔记(十)——Decorator装饰模式

    Decorator装饰模式是一种结构型模式,它主要是解决:"过度地使用了继承来扩展对象的功能",由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性:并且随着子类的增多(扩展功 ...

  4. HeadFrist设计模式学习之做一个万能遥控器(命令模式)

    让我们先来看一下命令模式的定义: 将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 看一下遥控器的需求: 可以控制所有的家电,进 ...

  5. 21.2.21 T3 粉刷匠 log P4158 SCOI 2009 总结

    题面 Description "我是一个粉刷匠,粉刷本领强~~~"粉刷匠qjx 哼着小曲高兴地开始了一天的工 作,这天qjx 有 n n n 条木板需要被粉刷.每条木板被分成 m ...

  6. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  7. 小小粉刷匠 牛客(区间dp)

    链接:https://ac.nowcoder.com/acm/problem/16129 来源:牛客网 题目描述 "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边 ...

  8. 小小粉刷匠(区间 dp)

    小小粉刷匠 题目描述 "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开心地刷着墙",兴致突然被打断,"小名,你今天如果刷不完这一栋楼的墙,那 ...

  9. 刷题记录:牛客NC16129小小粉刷匠

    传送门:牛客 题目描述: "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开心地刷着墙",兴致突然被打断,"小名,你今天如果刷不 完这一栋楼的 ...

  10. java设计模式学习笔记之装饰模式

    java设计模式学习笔记之装饰模式 尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697 这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧& ...

最新文章

  1. 判断三角形java代码_小猿圈Java循环嵌套语法的使用介绍
  2. Hyper-V应用指南之6-差异磁盘的使用[转]
  3. python filter函数_Python列表的8个实用技巧
  4. linux基础命令练习1
  5. ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint
  6. android双联动列表,Android Fragment实现列表和内容联动
  7. Ansible详解(十六)——Ansible配合Redis
  8. MySQL入门推荐书籍
  9. 软件常见的各种版本英文缩写
  10. dns和私人dns是什么意思?企业如何预防dns劫持?
  11. vue中使用v-for,出现警告 component lists rendered with v-for should have explicit keys
  12. Matlab 仿真——直流电机速度控制(2)系统分析
  13. oracle统计每个员工数,oracle按部门统计员工人数
  14. PDF如何在线压缩?PDF压缩到最小的方法
  15. uniapp开发:uniapp快速体验vue3.2之setup语法糖,怎么使用怎么爽
  16. 【python爬虫】scrapy框架案例实现数据保存入MySQL
  17. 浅谈Google SEO入行
  18. win10设置默认浏览器
  19. ​数字基建狂潮中:区块链处于什么位置?
  20. threejs-绘制剖切面

热门文章

  1. java微调器_Swing微调器示例
  2. 神仙道玄奇套装材料大全
  3. 老男孩Day1作业(二):三级菜单
  4. java 日期转换字符串_如何在java中将当前日期转换为字符串?
  5. 《缠中说禅108课》25:吻,MACD、背弛、中枢
  6. 《星际穿越》科学解析
  7. springboot JWT Token 自动续期的解决方案
  8. Android 字体自适应屏幕的方法
  9. 页式存储中的逻辑地址与物理地址之间的解析过程
  10. 【Vue】报错:Avoid mutating a prop directly since the value will be overwritten whenever the parent