0. 前言  

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

装饰模式是结构型设计模式之一,使用一种对客户透明的方式来动态拓展对象的功能,Java IO中各种流的嵌套就是装饰模式的很好体现。

1. 装饰模式介绍

装饰模式定义:

动态地给一个对象添加一些额外的功能,比生成子类要灵活。

装饰模式的使用场景:

需要透明且动态地拓展类的功能的场景。

装饰模式包括的角色:

(1)抽象组件Component类。

(2)组件具体实现ConcreteComponent类。也是被装饰的对象。

(3)抽象装饰类Decorator,内部持有一个组件对象的引用,职责就是装饰ConcreteComponent类。之所以是抽象的,就是为了方便不同的装饰“风格”子类的自定义实现。

(4)具体装饰类ConcreteDecorator。

2.  装饰模式实例介绍

想到装饰,很容易想到一个人穿衣服,在不同的季节穿不同的衣服,比如夏天穿短裤、冬天穿毛裤,但是不管什么季节,内裤肯定是要穿的。

抽象组件Component类就可以是抽象类Person,而ConcreteComponent类就可以是具体的一个人Calvin,也是要被装饰的对象。抽象装饰类Decorator持有了Calvin的引用,并且回调了Calvin本身的一个“穿内裤”的行为,并且在具体的装饰类中,即“冬夏”两个类中,分别为主人公Calvin穿上了毛裤和短裤,为对象增加了额外的功能。代码也比较简单,如下所示。

/*** Decorator Pattern* Created by Calvin on 2017/5/10.*/
public class Decorator {public static void main(String[] args) {Person calvin = new Calvin();PersonCloth summerCloth = new SummerCloth(calvin);PersonCloth winterCloth = new WinterCloth(calvin);summerCloth.dressed();winterCloth.dressed();}public static abstract class Person{public abstract void dressed();}public static class Calvin extends Person{@Overridepublic void dressed() {System.out.println("穿件内裤");}}public static abstract class PersonCloth extends Person{Person myPerson;public PersonCloth(Person myPerson) {this.myPerson = myPerson;}@Overridepublic void dressed() {myPerson.dressed();}}public static class SummerCloth extends PersonCloth{public SummerCloth(Person myPerson) {super(myPerson);}@Overridepublic void dressed() {super.dressed();System.out.println("穿件短裤");}}public static class WinterCloth extends PersonCloth{public WinterCloth(Person myPerson) {super(myPerson);}@Overridepublic void dressed() {super.dressed();System.out.println("穿件毛裤");}}
}

3.  装饰模式总结

装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。

装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用。

前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。

设计模式——装饰模式详解相关推荐

  1. 软件设计模式——装饰模式详解

    装饰模式(装饰设计模式) 在软件开发过程中,有时想用一些现存的组件.这些组件可能只是完成了一些核心功能.但在不改变其结构的情况下,可以动态地扩展其功能.所有这些都可以釆用装饰模式来实现. 装饰模式的定 ...

  2. 设计模式之装饰模式详解(附应用举例实现)

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

  3. 装饰模式(装饰设计模式)详解——小马同学@Tian

    装饰模式(装饰设计模式)详解 上班族大多都有睡懒觉的习惯,每天早上上班时间都很紧张,于是很多人为了多睡一会,就会用方便的方式解决早餐问题.有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不 ...

  4. 策略模式(策略设计模式)详解

    策略模式(策略设计模式)详解 在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机.乘坐火车.骑自行车或自己开私家车等,超市促销可以釆用打折.送商品.送积分等方法. ...

  5. C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)

    C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...

  6. 单例模式(单例设计模式)详解

    在有些系统中,为了节省内存资源.保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式. 单例模式的定义与特点 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自 ...

  7. 设计模式(10)-装饰模式详解(易懂)

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

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

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

  9. Java设计模式——装饰模式(装饰设计模式)详解

    装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式. 装饰(Decorator)模式 ...

最新文章

  1. Github中文项目排行榜,你永远想不到开发者都用它干了什么
  2. 大白话系列之C#委托与事件讲解(三)
  3. “注册编辑已被管理员停用”之解决办法
  4. Anker—工作学习笔记
  5. centos7 关于php使用pdo扩展连接数据库详细步骤
  6. C项目案例实践(0)-语言基础
  7. 【思科模拟器基本使用】
  8. 原来手机图片转文字这么简单!按下这个按钮,纸质稿轻松电子化
  9. carla--使用python进行carla交互仿真
  10. nslookup命令反解ip_桌面运维常用命令
  11. 基于图像的三维建模——特征点检测与匹配
  12. Golang神奇的2006-01-02 15:04:05
  13. Hanselminutes播客242-与Pete Brown的远程工作者的困境
  14. php php_openssl.dll,php_openssl.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  15. nmap与hydra
  16. uni-app使用ucharts图表 ##uni-app ##uCharts
  17. 基于单片机的农业大棚
  18. 从《速度与激情》之布莱恩说起
  19. mac本如何在文件夹中打开终端
  20. 【AI应用】NVIDIA GeForce RTX 3070的详情参数

热门文章

  1. 在excel表格中,根据身份证号码就可以自动提取出生年月、性别、年龄。
  2. 编写一个程序,提示用户输入身高单位(英寸,米,厘米)包括姓名使用float类型
  3. 韩国烧脑片力荐,错过一眼都可能会是遗憾
  4. PHP教程smarty学习指南
  5. Python tkinter 学习笔记(3) -- 界面布局1(grid和pack)
  6. 2020-07-13 html的p标签嵌套img + css的3大特性 + JS的客户端服务端时间不对称 + http与https切换时共用cookie和localStorage
  7. 理解CSV格式规范(解析CSV必备)
  8. Java 校验时间格式是否为 yyyy-MM-dd HH:mm:ss
  9. 2021年宏观经济十大趋势展望
  10. MSTAR数据集下载