装饰模式的定义

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

模型:

  • 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. 设计模式之装饰模式详解(附应用举例实现)

    文章目录 1 装饰模式介绍 2 装饰模式详解 2.1 装饰模式结构 2.2 装饰模式实现 2.3 装饰模式应用举例 3 透明装饰模式和半透明装饰模式 1 装饰模式介绍 在生活中,我们往往会给图片增加一 ...

  2. 设计模式java装饰模式范例_Java设计模式之装饰模式详解

    装饰者模式是动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 假设我们有一个需求,是给一家饮料店做一个计算各种饮料价格的功能.听起来很简单,我们创建一个抽象父类Bever ...

  3. java connection 单例_Java设计模式之单例模式详解

    Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...

  4. OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

    OpenCV-Python实战(10)--详解 OpenCV 轮廓检测 0. 前言 1. 轮廓介绍 2. 轮廓检测 3. 轮廓压缩 4. 图像矩 4. 1 一些基于矩的对象特征 4.2 Hu 不变矩 ...

  5. I2C从地址之7位,8位和10位详解

    IIC/I2C从地址之7位,8位和10位详解 概述 经常有用户问我,使用USB2XXX的USB2IIC功能的时候,从机地址应该怎么传递的问题,这个问题的根源在于不同的I2C从机厂商采用了不同的I2C总 ...

  6. 设计模式——状态模式详解

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

  7. Java高并发编程详解系列-线程上下文设计模式及ThreadLocal详解

    导语   在之前的分享中提到过一个概念就是线程之间的通信,都知道在线程之间的通信是一件很消耗资源的事情.但是又不得不去做的一件事情.为了保证多线程线程安全就必须进行线程之间的通信,保证每个线程获取到的 ...

  8. 常见设计模式实现、详解及在Spring中的应用

    Spring中涉及到的设计模式详解 一.单例模式 1.介绍 要点: 某个类只能有一个实例: 它必须自行创建这个实例: 它必须自行向整个系统提供这个实例. 实现: 单例模式的类只提供私有的构造函数(这样 ...

  9. java单例设计模式_Java设计模式之单例模式详解

    在Java开发过程中,很多场景下都会碰到或要用到单例模式,在设计模式里也是经常作为指导学习的热门模式之一,相信每位开发同事都用到过.我们总是沿着前辈的足迹去做设定好的思路,往往没去探究为何这么做,所以 ...

最新文章

  1. 美国多个城市禁止、我国却蓬勃发展的人脸识别是什么样子?
  2. 两所大学中的智能车竞赛校内赛
  3. BUUCTF(pwn)bjdctf_2020_babystack2
  4. shell 中的运算
  5. 使用Qt正则表达式提取全路径的文件名
  6. Linux实验二:vi编辑器的使用
  7. ajax 直接向后台发送请求,通过ajax异步向后端发送请求,响应请求向前端传送json格式数据的实现思路...
  8. @程序员,如何解决开发和运维之间的固有隔阂?
  9. matlab m文件开方,请问,在matlab里面如果输入开方号(根号)?如9的开方怎么写?
  10. 土建类技术质量知识题库
  11. 网络电视机顶盒测试软件,网络机顶盒最值得安装的软件,可免费收看全网vip独播剧!...
  12. python-定义类的属性
  13. 打造平台化保险产业生态圈的四种模式
  14. ad7705c语言程序,TM7705低成本16位高精度ADC方案 附技术手册和C语言代码
  15. Houdini14:动画入门
  16. OpenGL纹理贴图
  17. 【数据结构与算法】动态规划
  18. 逻辑地址 与物理地址的转换
  19. 操作系统原理课程设计任务书
  20. xe6 动态元素数量

热门文章

  1. 递归回溯解决八皇后问题
  2. 开源 RPC 框架有哪些呢?
  3. 计算机视觉——利用openCV与Socket结合进行远程摄像头实时视频传输并保存图片数据
  4. ROS学习:创建机器人的urdf
  5. 微信小程序-WXML转换类型
  6. matlab 神经网络ann用于分类方法
  7. 计算机专业英语第3章,计算机专业英语教案第3章
  8. 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测
  9. 【Linux】29.扫描本机同一局域网内 某端口开启 的主机
  10. Machine Learning - Andrew Ng on Coursera (Week 1)