装饰模式的定义

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

通俗的说, 就是对一个类或方法进行包装

装饰模式的通用类图:

类图中的四个角色说明如下:

  1. Component 抽象构件: Component是一个接口或抽象类, 就是定义我们最核心的角色, 也就是最原始的对象. 在装饰模式中, 必然有一个最基本、最核心的接口或抽象类充当 Component 抽象构件
  2. ConcreteComponent 具体构件: ConcreteComponent 是最核心、最原始、最基本的接口或抽象类的实现, 要装饰的就是它
  3. Decorator 装饰角色: 一般是一个抽象类, 实现接口或抽象方法, 它里面不一定有抽象的方法, 在它的属性中必然有一个private变量指向Component抽象构件
  4. 具体装饰类: ConcreateDecrator是具体的装饰类, 要把最核心的、最原始的、最基本的东西装饰成其他东西. 当只有一个装饰类时, 可以没有抽象装饰角色

具体实现代码如下:

抽象装饰者代码:

具体装饰者代码:

场景类:

装饰模式应用

装饰模式的优点:

  1. 装饰类和被装饰类可以独立发展, 而不会相互耦合. 也就是说, Component 类无需知道 Decorator 类, Decorator 类是从外部来扩展 Component类的功能, 而Decorator也不用知道具体的构件
  2. 装饰模式是继承关系的一个替代方案. 我们看装饰类 Decorator, 不管装饰多少层, 返回的对象还是 Component.
  3. 装饰模式可以动态的扩展一个实现类的功能

装饰模式的缺点:

对于装饰模式记住一点就够了: 多层的装饰是比较复杂的.

装饰模式的应用场景:

  1. 需要扩展一个类的功能, 或给一个类增加附加功能
  2. 需要动态的给一个对象增加功能, 这些功能可以再动态的撤销
  3. 需要为一批的兄弟类进行改装或加装功能, 当然首选装饰模式

装饰模式是对继承的有力补充. 要知道继承不是万能的, 在项目中要考虑诸如易维护、易扩展、易复用等, 而且在一些情况下要是用继承就会增加很多子类, 而且灵活性非常差, 当然维护也不容易了, 也就是说装饰模式可以替代继承, 解决类膨胀的问题. 同时, 继承是静态的给类增加功能, 而装饰模式是动态的增加功能.

装饰模式还有一个非常好的优点: 扩展性非常好.

23种设计模式之装饰模式相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之装饰模式

    · 装饰模式在王者荣耀中的应用 · 一.简述 在王者荣耀这款游戏中,英雄在战场上高伤害.高爆发.高移速等是所有玩家共同追求的,那么这些所谓的伤害.移速.穿透力等英雄属性我们可以通过在局外对英雄附带皮肤 ...

  2. 精讲23种设计模式-基于装饰模式~设计多级缓存框架

    文章目录 一.装饰模式 1. 回顾多级缓存基本概念 2. 装饰模式基本的概念 3. 装饰模式应用场景 4. 装饰者模式定义 5. 基于Map手写Jvm内置缓存 二.手写一级与二级缓存 2.1. red ...

  3. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  4. 从追MM谈23种设计模式

    从追MM谈Java的23种设计模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说&quo ...

  5. 【设计模式】Java 23种设计模式对比总结

    一.设计模式的分类 创建型模式,共五种(1-5):工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种(6-12):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  6. 【java】java开发中的23种设计模式详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  7. java 23种设计模式及具体例子 收藏有时间慢慢看

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...

  8. 坦克大战java_清华毕业大佬用一个坦克大战项目讲完了23种设计模式

    先给大家讲述一下坦克大战是怎么进行运行的. 坦克大战第一节: new 出一个窗口: 设定标题栏内容: TankFrame从Frame继承+显示: 认识paint方法,重写: 坦克大战第二节 学习gra ...

  9. 23种设计模式的有趣见解 .

    转载地址:http://blog.csdn.net/leichelle/article/details/7999588 23种设计模式的有趣见解 23种设计模式的有趣见解创 建型模式 1.FACTOR ...

最新文章

  1. for循环 消耗时间计算
  2. Eclipse新建工程编译R cannot be resolved to a variable问题
  3. PAT甲级1136 A Delayed Palindrome :[C++题解]回文串和高精度并输出过程
  4. PAT1001 A+B Format (20 分)
  5. python找出一个数的所有因子_python – 找到最大素因子的正确算法
  6. ORA-00845: MEMORY_TARGET not supported on this system
  7. 年底各类年会邀请函也要美美的设计
  8. linux 导出 excel文件名乱码,excel导出,文件名称中文乱码问题 · 大腿的博客
  9. AD域控Exchange邮箱(二)——卸载ExchangeServer2010报错:“有些控件无效 - 请指定要卸载的现有服务器” 解决方法
  10. Linux上FTP服务的相关配置2:搭建FTPs及虚拟账号
  11. 我为什么不再推荐 RxJava
  12. OCS Inventory NG使用之win平台下的AGENT端安装与信息收集(一)
  13. java并发包(JUC)
  14. 印象笔记如何与微信连接到服务器,如何保存微信和微博到印象笔记?
  15. Speedoffice(excel)如何运用公式通过身份证号码提取出性别
  16. Servlet 容器
  17. 稳定排序与不稳定排序
  18. windows media player 官方修复工具下载及修复方法
  19. 从一道面试题掌握ES6的综合运用(有彩蛋)
  20. Word2010如何隐藏去掉回车符

热门文章

  1. Modbus协议栈开发笔记之七:Modbus ASCII Slave开发
  2. 微型计算机的应用特点,微型计算机的特点及应用
  3. android游戏编程之从零开始_纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子...
  4. IOC操作Bean管理XML方式(FactoryBean)
  5. JAVAWEB入门tomcat服务器配置
  6. java报错symbol_为何此处会出现找不到symbol的错误呢?
  7. python计算汉明距离_有效地使用python计算汉明距离
  8. 三农电子商务创业创新大赛作品_全国大学生电子商务“创新、创意及创业”挑战赛五邑大学校赛...
  9. python数据去重的函数_python pandas dataframe 去重函数的具体使用
  10. matlab源代码 语义相似度计算,如何计算两个句子之间的相似度(句法和语义)...