23种设计模式之装饰模式
装饰模式的定义
定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说, 装饰模式相比生成子类更为灵活.
通俗的说, 就是对一个类或方法进行包装
装饰模式的通用类图:
类图中的四个角色说明如下:
- Component 抽象构件: Component是一个接口或抽象类, 就是定义我们最核心的角色, 也就是最原始的对象. 在装饰模式中, 必然有一个最基本、最核心的接口或抽象类充当 Component 抽象构件
- ConcreteComponent 具体构件: ConcreteComponent 是最核心、最原始、最基本的接口或抽象类的实现, 要装饰的就是它
- Decorator 装饰角色: 一般是一个抽象类, 实现接口或抽象方法, 它里面不一定有抽象的方法, 在它的属性中必然有一个private变量指向Component抽象构件
- 具体装饰类: ConcreateDecrator是具体的装饰类, 要把最核心的、最原始的、最基本的东西装饰成其他东西. 当只有一个装饰类时, 可以没有抽象装饰角色
具体实现代码如下:
抽象装饰者代码:
具体装饰者代码:
场景类:
装饰模式应用
装饰模式的优点:
- 装饰类和被装饰类可以独立发展, 而不会相互耦合. 也就是说, Component 类无需知道 Decorator 类, Decorator 类是从外部来扩展 Component类的功能, 而Decorator也不用知道具体的构件
- 装饰模式是继承关系的一个替代方案. 我们看装饰类 Decorator, 不管装饰多少层, 返回的对象还是 Component.
- 装饰模式可以动态的扩展一个实现类的功能
装饰模式的缺点:
对于装饰模式记住一点就够了: 多层的装饰是比较复杂的.
装饰模式的应用场景:
- 需要扩展一个类的功能, 或给一个类增加附加功能
- 需要动态的给一个对象增加功能, 这些功能可以再动态的撤销
- 需要为一批的兄弟类进行改装或加装功能, 当然首选装饰模式
装饰模式是对继承的有力补充. 要知道继承不是万能的, 在项目中要考虑诸如易维护、易扩展、易复用等, 而且在一些情况下要是用继承就会增加很多子类, 而且灵活性非常差, 当然维护也不容易了, 也就是说装饰模式可以替代继承, 解决类膨胀的问题. 同时, 继承是静态的给类增加功能, 而装饰模式是动态的增加功能.
装饰模式还有一个非常好的优点: 扩展性非常好.
23种设计模式之装饰模式相关推荐
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之装饰模式
· 装饰模式在王者荣耀中的应用 · 一.简述 在王者荣耀这款游戏中,英雄在战场上高伤害.高爆发.高移速等是所有玩家共同追求的,那么这些所谓的伤害.移速.穿透力等英雄属性我们可以通过在局外对英雄附带皮肤 ...
- 精讲23种设计模式-基于装饰模式~设计多级缓存框架
文章目录 一.装饰模式 1. 回顾多级缓存基本概念 2. 装饰模式基本的概念 3. 装饰模式应用场景 4. 装饰者模式定义 5. 基于Map手写Jvm内置缓存 二.手写一级与二级缓存 2.1. red ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 从追MM谈23种设计模式
从追MM谈Java的23种设计模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说&quo ...
- 【设计模式】Java 23种设计模式对比总结
一.设计模式的分类 创建型模式,共五种(1-5):工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种(6-12):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...
- 【java】java开发中的23种设计模式详解
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java 23种设计模式及具体例子 收藏有时间慢慢看
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...
- 坦克大战java_清华毕业大佬用一个坦克大战项目讲完了23种设计模式
先给大家讲述一下坦克大战是怎么进行运行的. 坦克大战第一节: new 出一个窗口: 设定标题栏内容: TankFrame从Frame继承+显示: 认识paint方法,重写: 坦克大战第二节 学习gra ...
- 23种设计模式的有趣见解 .
转载地址:http://blog.csdn.net/leichelle/article/details/7999588 23种设计模式的有趣见解 23种设计模式的有趣见解创 建型模式 1.FACTOR ...
最新文章
- for循环 消耗时间计算
- Eclipse新建工程编译R cannot be resolved to a variable问题
- PAT甲级1136 A Delayed Palindrome :[C++题解]回文串和高精度并输出过程
- PAT1001 A+B Format (20 分)
- python找出一个数的所有因子_python – 找到最大素因子的正确算法
- ORA-00845: MEMORY_TARGET not supported on this system
- 年底各类年会邀请函也要美美的设计
- linux 导出 excel文件名乱码,excel导出,文件名称中文乱码问题 · 大腿的博客
- AD域控Exchange邮箱(二)——卸载ExchangeServer2010报错:“有些控件无效 - 请指定要卸载的现有服务器” 解决方法
- Linux上FTP服务的相关配置2:搭建FTPs及虚拟账号
- 我为什么不再推荐 RxJava
- OCS Inventory NG使用之win平台下的AGENT端安装与信息收集(一)
- java并发包(JUC)
- 印象笔记如何与微信连接到服务器,如何保存微信和微博到印象笔记?
- Speedoffice(excel)如何运用公式通过身份证号码提取出性别
- Servlet 容器
- 稳定排序与不稳定排序
- windows media player 官方修复工具下载及修复方法
- 从一道面试题掌握ES6的综合运用(有彩蛋)
- Word2010如何隐藏去掉回车符
热门文章
- Modbus协议栈开发笔记之七:Modbus ASCII Slave开发
- 微型计算机的应用特点,微型计算机的特点及应用
- android游戏编程之从零开始_纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子...
- IOC操作Bean管理XML方式(FactoryBean)
- JAVAWEB入门tomcat服务器配置
- java报错symbol_为何此处会出现找不到symbol的错误呢?
- python计算汉明距离_有效地使用python计算汉明距离
- 三农电子商务创业创新大赛作品_全国大学生电子商务“创新、创意及创业”挑战赛五邑大学校赛...
- python数据去重的函数_python pandas dataframe 去重函数的具体使用
- matlab源代码 语义相似度计算,如何计算两个句子之间的相似度(句法和语义)...