前言

顾名思义,就是对已经存在的某些类进行装饰,以此来扩展某些功能。在不改变类文件和使用继承的情况下,动态的扩展一个对象的功能,是继承的替代方案之一。通过创建一个包装对象,即装饰包裹真实的对象。

定义

动态的给一个对象添加一些额外的职责。

结构图

角色拆解:
1.Component:抽象组件,可以是接口或抽象类,被装饰的最原始的对象
2.ConcreteComponent:组件具体实现类,实现Component,被装饰的具体对象
3.Decorator:抽象装饰者,从外类来拓展Component(抽象组件)的功能,但是对Component来说根本不需要知道Decorator的存在。Decorator的属性中必然有一个private变量指向Component抽象组件
4.ConcreteDecorator:装饰者的具体实现类

举栗实现

比如说笔者喜欢迈腾,但是苦于囊中羞涩手中预算只能考虑1.4T乞丐版。不愧是乞丐版,大屏、倒车影像统统没有。于是就去某宝,买了原厂德赛西威187b,换上了原装大屏和倒车影像。EA211的发动机+不俗的空间表现已经很强劲,再加装了中控大屏和倒车影像,对这辆迈腾起到了“装饰”作用

1.Component抽象组件

汽车里的代表之一就是大众了,先定义汽车的抽象类,里面有大众的抽象方法。

public abstract class Car {//汽车里面有内饰升级的抽象方法public abstract void decoration();
}

2.ConcreteComponent组件具体实现类

被装饰的具体对象,这里就是一汽大众的支柱——迈腾。

public class Magotan extends Car {@Overridepublic void decoration() {System.out.print("迈腾空间大,操控感强");}
}

3.Decorator抽象装饰者

保持了对抽象组件的引用,方便调用被装饰者的方法。这里我们要保持Taobao对Car类的引用,方便对汽车的装饰

public abstract class Taobao extends Car {private Car car;public Taobao(Car car) {this.car = car;}@Overridepublic void decoration() {car.decoration();}
}

4.ConcreteDecorator装饰者具体实现类

这里我们就暂时先用2个装饰者具体实现类,分别是中控大屏和倒车影像。

public class Desaysv extends Taobao {public Desaysv(Car car) {super(car);}public void install(){System.out.print("安装德赛西威187b");}@Overridepublic void decoration() {super.decoration();install();}
}
public class Camera extends Taobao {public Camera(Car car) {super(car);}public void install(){System.out.print("安装倒车影像");}@Overridepublic void decoration() {super.decoration();install();}
}

5.客户端调用
去4s店把乞丐版迈腾提出来,原厂升级中控大屏和倒车影像

public class Client {public static void main(String []args){Magotan magotan = new Magotan();//230乞丐版迈腾提车Desaysv desaysv = new Desaysv(magotan);//安装德赛西威187bdesaysv.volkswagen();Camera camera = new Camera(magotan);//安装倒车影像camera.volkswagen();}
}

优缺点对比

优点
1.通过组合而非继承,动态的拓展功能。选择不同的装饰器,起到不同的作用
2.避免了继承带来的灵活性差、子类不能无限制扩张
3.具体组件类和具体装饰类可以独立变化,用户可以根据需求进行对应的增加。组合使用不破坏原来代码,符合开放封闭原则
缺点
1.所有的对象都要继承Component,一旦抽象组件改变,其余的都得吃瓜落
2.出了错不好找
3.装饰层数过多会影响效率

使用场景

1.在不影响其他对象的情况下,动态、透明的去给单个对象添加职责
2.需要动态的给一个对象添加功能,当然这些功能也能够动态的撤销
3.无法使用继承时

设计模式之装饰模式学习笔记相关推荐

  1. 设计模式之禅学习笔记

    设计模式 一,六大设计原则[SOLID] 1,单一职责[SRP]:应该有且仅有一个原因引起类的变更. "职责"和"变化原因"都是不可度量的,因项目和实际环境而异 ...

  2. 设计模式之单例模式学习笔记

    前言 单例模式是最常用到的设计模式之一,比如封装网络请求框架时,RxJava+Retrofit的封装过程就用到了单例模式.顾名思义,保证一个类只有一个实例,并提供一个访问它的全局访问点.也就是说,要确 ...

  3. 设计模式之观察者模式学习笔记

    前言 观察者模式,又叫作发布-订阅模式.一般的特点为对象间的关系为一对多,当一个对象被修改的时候,就会通知它依赖的对象 定义 定义对象间一种一对多的依赖关系,每当一个对象状态发生改变时,所有依赖于它的 ...

  4. java 模块设计模式_Java9模块化学习笔记二之模块设计模式

    模块设计的原则: 1.防止出现编译时循环依赖(主要是编译器不支持),但运行时是允许循环依赖的,比如GUI应用 2.明确模块的边界 几种模块设计: API模块,聚合模块(比如java.base) 可选依 ...

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

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

  6. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

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

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

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

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  9. 设计模式学习笔记(目录篇)

    设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三 ...

最新文章

  1. Django mysql 多线程_【实例:利用Django管理后台管理IP地址】(四)Django test+多线程+数据库+(踩坑)...
  2. IDEA(IntelliJ IDEA)+常用快捷键(short cuts)
  3. JAVA不借助第三个变量实现两个变量交换的思考
  4. es6 混合commjs_详谈commonjs模块与es6模块的区别
  5. 共享两个做项目最常用功能操作的封装类
  6. 深度学习框架PyTorch与TensorFlow,谁更胜一筹?
  7. js ---- 对象转JSON,JSON转对象
  8. 离散数学杜忠复版答案_离散数学(第二版)课后习题答案详解(完整版)
  9. 前端开发需要学习的技术:
  10. 【计算机网络】—什么是蜂窝移动网络?
  11. html 小游戏 俄罗斯方块
  12. 云智巡在连锁药店的巡检作用
  13. 机器学习中的特征重要性 Feature Importance
  14. Maven filter 导致打包以后的excel文件损坏的问题
  15. kernel下Documentation目录详解
  16. web UI自动化 python+selenium 爬取网易云排行榜歌曲列表
  17. 用Python学数学之Sympy代数符号运算
  18. 伯恩PAC人格结构理论(转载)
  19. 2021-06-12Leetcode394.字符串解码
  20. JavaScript基础算法——Roman Numeral Converter(阿拉伯数转换罗马数字)

热门文章

  1. memcached客户端_对比Memcached和Redis,谁才是适合你的缓存?
  2. MacOS系统下简单安装以及配置MongoDB数据库(一)
  3. jenkins页面中英文切换配置
  4. 局域网无法上网解决处理方法
  5. 建立jackrabbit内容仓库实例
  6. Android CursorAdapter
  7. cocos2d-x 自己写的一个scrollview 有待完善
  8. scau实验题 8596 Longest Ordered Subsequence
  9. Nagios监控部署(四)--被监控主机配置
  10. chapter_2 索引优先队列