设计模式(10)-装饰模式详解(易懂)
装饰模式的定义
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
模型:
- Component:抽象组件,是一个接口或者抽象类;就是定义的最原始的对象
- ConcreteComponent:具体组件,实现类(需要装饰)
- Decorator:装饰角色,一般是抽象类,实现接口;它的属性必然有个private变量指向Conponent抽象组件
- ConcreteDecorator:具体的装饰对象
实例说明
举个例子:比如一个正在上高中的学生“小明”在考完试后,和父母说想买一款5000元的手机。
1.Component,抽象方法-买手机
public abstract class AbstractBuyPhone {//主要是向父母提出想买手机的意向public abstract void BuyPhone();//父母是否同意public abstract void Agree();
}
2.ConcreteComponent:具体的意向
public class XiaoMingBuyPhone extends AbstractBuyPhone {@Overridepublic void BuyPhone() {Log.d("qzs","我想买一款华为的5000元的手机");}@Overridepublic void Agree() {Log.d("qzs","父母同意了");}
}
3.Decorator,增加一个装饰抽象类,方便修饰
public class AbstractDecorator extends AbstractBuyPhone {private AbstractBuyPhone abstractBuyPhone;public AbstractDecorator ( AbstractBuyPhone abstractBuyPhone){this.abstractBuyPhone=abstractBuyPhone;}@Overridepublic void BuyPhone() {this.abstractBuyPhone.BuyPhone();}@Overridepublic void Agree() {this.abstractBuyPhone.Agree();}
}
4.ConcreteDecorator:如果直接去找父母要手机,很容易被拒绝,所以需要修饰一下,这里用成绩修饰一下
public class ScoreDecortator extends AbstractDecorator {public ScoreDecortator(AbstractBuyPhone abstractBuyPhone) {super(abstractBuyPhone);}//先和父母说说自己的成绩private void ShowScore(){Log.d("qzs","我这次考试的成绩年级前三,又进步了");}//重写买手机的方法,先汇报成绩,然后再提买手机的事情@Overridepublic void BuyPhone() {this.ShowScore();super.BuyPhone();}
}
5.调用,也就是请求父母:
AbstractBuyPhone str;//小明的原本意向str=new XiaoMingBuyPhone();//修饰后的意向str=new ScoreDecortator(str);//向父母提出想法(成绩和买手机)str.BuyPhone();//父母同意了str.Agree();
运行结果:
强调:这里只加了分数的修饰,可以加多个修饰类来满足你最后的目的
装饰模式的优缺点及其他
1.优点
- Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
2.缺点
- 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
- 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
- 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。
3.适用场景
- 需要扩展一个类的功能,或给一个类添加附加职责。
- 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
定义和优缺点来自网上百度信息
另外可以加入我的Android技术交流群:458739310
大家可以关注我的微信公众号:「安卓干货铺」一个有质量、有态度的公众号!
设计模式(10)-装饰模式详解(易懂)相关推荐
- 设计模式之装饰模式详解(附应用举例实现)
文章目录 1 装饰模式介绍 2 装饰模式详解 2.1 装饰模式结构 2.2 装饰模式实现 2.3 装饰模式应用举例 3 透明装饰模式和半透明装饰模式 1 装饰模式介绍 在生活中,我们往往会给图片增加一 ...
- 设计模式java装饰模式范例_Java设计模式之装饰模式详解
装饰者模式是动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 假设我们有一个需求,是给一家饮料店做一个计算各种饮料价格的功能.听起来很简单,我们创建一个抽象父类Bever ...
- java connection 单例_Java设计模式之单例模式详解
Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...
- OpenCV-Python实战(10)——详解 OpenCV 轮廓检测
OpenCV-Python实战(10)--详解 OpenCV 轮廓检测 0. 前言 1. 轮廓介绍 2. 轮廓检测 3. 轮廓压缩 4. 图像矩 4. 1 一些基于矩的对象特征 4.2 Hu 不变矩 ...
- I2C从地址之7位,8位和10位详解
IIC/I2C从地址之7位,8位和10位详解 概述 经常有用户问我,使用USB2XXX的USB2IIC功能的时候,从机地址应该怎么传递的问题,这个问题的根源在于不同的I2C从机厂商采用了不同的I2C总 ...
- 设计模式——状态模式详解
0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...
- Java高并发编程详解系列-线程上下文设计模式及ThreadLocal详解
导语 在之前的分享中提到过一个概念就是线程之间的通信,都知道在线程之间的通信是一件很消耗资源的事情.但是又不得不去做的一件事情.为了保证多线程线程安全就必须进行线程之间的通信,保证每个线程获取到的 ...
- 常见设计模式实现、详解及在Spring中的应用
Spring中涉及到的设计模式详解 一.单例模式 1.介绍 要点: 某个类只能有一个实例: 它必须自行创建这个实例: 它必须自行向整个系统提供这个实例. 实现: 单例模式的类只提供私有的构造函数(这样 ...
- java单例设计模式_Java设计模式之单例模式详解
在Java开发过程中,很多场景下都会碰到或要用到单例模式,在设计模式里也是经常作为指导学习的热门模式之一,相信每位开发同事都用到过.我们总是沿着前辈的足迹去做设定好的思路,往往没去探究为何这么做,所以 ...
最新文章
- 美国多个城市禁止、我国却蓬勃发展的人脸识别是什么样子?
- 两所大学中的智能车竞赛校内赛
- BUUCTF(pwn)bjdctf_2020_babystack2
- shell 中的运算
- 使用Qt正则表达式提取全路径的文件名
- Linux实验二:vi编辑器的使用
- ajax 直接向后台发送请求,通过ajax异步向后端发送请求,响应请求向前端传送json格式数据的实现思路...
- @程序员,如何解决开发和运维之间的固有隔阂?
- matlab m文件开方,请问,在matlab里面如果输入开方号(根号)?如9的开方怎么写?
- 土建类技术质量知识题库
- 网络电视机顶盒测试软件,网络机顶盒最值得安装的软件,可免费收看全网vip独播剧!...
- python-定义类的属性
- 打造平台化保险产业生态圈的四种模式
- ad7705c语言程序,TM7705低成本16位高精度ADC方案 附技术手册和C语言代码
- Houdini14:动画入门
- OpenGL纹理贴图
- 【数据结构与算法】动态规划
- 逻辑地址 与物理地址的转换
- 操作系统原理课程设计任务书
- xe6 动态元素数量
热门文章
- 递归回溯解决八皇后问题
- 开源 RPC 框架有哪些呢?
- 计算机视觉——利用openCV与Socket结合进行远程摄像头实时视频传输并保存图片数据
- ROS学习:创建机器人的urdf
- 微信小程序-WXML转换类型
- matlab 神经网络ann用于分类方法
- 计算机专业英语第3章,计算机专业英语教案第3章
- 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测
- 【Linux】29.扫描本机同一局域网内 某端口开启 的主机
- Machine Learning - Andrew Ng on Coursera (Week 1)