装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式。装饰器模式 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。

装饰器模式 的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能

本篇内容包括:关于装饰器模式、装饰器实现 Demo


文章目录

  • 一、关于装饰器模式
    • 1、关于装饰器模式
    • 2、关于装饰器模式的构成
    • 3、关于装饰器模式的UML
    • 4、关于装饰器模式的优缺点
    • 5、装饰器模式、代理模式之间的区别
  • 二、装饰器实现 Demo
    • 1、Demo 实现
    • 2、Demo 测试

一、关于装饰器模式

1、关于装饰器模式

装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式。

装饰器模式 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。

装饰器模式 的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能

2、关于装饰器模式的构成

适配器模式一般包含四种角色:

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

3、关于装饰器模式的UML

4、关于装饰器模式的优缺点

# 装饰器模式的优点

  • 功能扩展灵活,而不依赖继承;
  • 可以对同一个对象进行多种装饰;

# 装饰器模式的缺点

装饰方式可能比较复杂,如果嵌套太多,容易造成代码可读性变差和出错。

5、装饰器模式、代理模式之间的区别

对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口,他们之间的边界确实比较模糊,两者都是对类的方法进行扩展,具体区别如下:

  1. 装饰器模式强调的是增强自身,在被装饰之后你能够在被增强的类上使用增强后的功能。增强后你还是你,只不过能力更强了而已;代理模式强调要让别人帮你去做一些本身与你业务没有太多关系的职责(记录日志、设置缓存)。代理模式是为了实现对象的控制,因为被代理的对象往往难以直接获得或者是其内部不想暴露出来。
  2. 装饰模式是以对客户端透明的方式扩展对象的功能,是继承方案的一个替代方案;代理模式则是给一个对象提供一个代理对象,并由代理对象来控制对原有对象的引用;

二、装饰器实现 Demo

1、Demo 实现

# Component 抽象构件角色

interface Component {public void operation();
}

# ConcreteComponent 具体构件角色

class ConcreteComponent implements Component {public ConcreteComponent() {System.out.println("创建具体构件角色");}public void operation() {System.out.println("调用具体构件角色的方法operation()");}
}

# Decorator 抽象装饰角色

abstract class Decorator implements Component {private Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}

# ConcreteDecorator 具体装饰角色

class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}public void operation() {super.operation();addedFunction();}public void addedFunction() {System.out.println("为具体构件角色增加额外的功能addedFunction()");}
}

2、Demo 测试

public class Client {public static void main(String[] args) {Component p = new ConcreteComponent();p.operation();Component d = new ConcreteDecorator(p);d.operation();}
}

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

  1. python装饰器由浅入深_详解Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  2. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  3. Go 设计模式 - 装饰器模式

    装饰模式使用对象组合的方式动态改变或增加对象行为.Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式.使用匿名组合,在装饰器中不必显式定义转调原对象方法. 设计模式 装饰器模式 装饰器模式主要 ...

  4. Spring设计模式(装饰器模式)

    Spring设计模式(装饰器模式) 模式的定义: 装饰者模式定义: ​ 动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案. 模式的结构图 : 模式包含角 ...

  5. Java设计模式-装饰器模式 理论代码相结合

    继Java设计模式适配器模式后的装饰器模式来啦,让我们一起看看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一 ...

  6. 设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.简单来说,装饰器模式就是 ...

  7. PHP设计模式——装饰器模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 装饰器模式又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装 ...

  8. 设计模式-装饰器模式 C++

    一.简介 1.什么是装饰器模式 装饰器模式是结构型设计模式. 装饰器是现有类的一个包装,可以在不修改现有类且不增加子类的情况下扩展现有类. [注]可以实现向一个现有对象添加新的功能,同时又不改变其结构 ...

  9. 设计模式---装饰器模式(C++实现)

    装饰器模式(Decorator Pattern)允许向一个现有对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  10. C++设计模式 装饰器模式

    文章目录 1. 先验知识 2. 装饰器模式相关概念 3. 装饰器模式的应用 3.1 应用1: 给形状添加新的特征 不同形状加红 3.2 应用2: 给一个人穿不同的衣服 a 直接person类, 增加穿 ...

最新文章

  1. 迷惑行为赏析:把 jpg 图片加密后卖了 247 万
  2. 营销型网站建设需要注意哪些问题?
  3. IBatis.Net学习笔记系列文章
  4. 【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作
  5. Android 编程下快捷图标的创建
  6. 【linux】Centos 8 安装 悟空CRM-11.0
  7. 用计算机画 信息技术课标要求,[引用]小学信息技术课程标准
  8. 让远程传输大文件变得更快
  9. 山东民办计算机专业排名2015,2021年山东最好的民办大学排名
  10. react-router的BrowserHistory 和 HashHistory 的区别,如何解决使用BrowserHistory 引起的访问路径问题
  11. php后缀名隐藏,php隐藏后缀名的方法是什么
  12. JAVA屏幕截图与水印添加程序-HEHEHEScreenshot
  13. arcsde 10.2 for oracle 安装,ArcSDE 10.2 for Oracle 12C安装注意事项
  14. 自制一个H5图片拖拽、裁剪插件(原生JS)
  15. 【数据结构-栈】C语言实现顺序栈基本操作
  16. 非门芯片 74AHC1G08 74AHC1G04 74AHC1G02的区别
  17. 利用selenium实时监测交大经管学院前沿讲座更新状态_20200527_
  18. 名词性短语和名词性从句
  19. go-ipfs命令详解之files
  20. windows云服务器,如何使用windows云服务器

热门文章

  1. The authenticity of host #39;slaver2 (192.168.199.132)#39; can#39;t be established. RSA key finge...
  2. 学校的校园广播是如何设置的
  3. 这个0成本必赚套利方法,值得你学习!
  4. cadence——基本操作5
  5. 项目管理:跟「政商大亨」虞洽卿学干系人管理
  6. C语言 定义变量详解
  7. 【微信小程序】制作个人信息页面
  8. 深入理解java的finalize
  9. 怎么把高版本的CAD文件转换成低版本的
  10. matlab物理计算与可视化,清华大学出版社-图书详情-《MATLAB物理计算与可视化》...