1. 装饰器模式(Decorator)介绍

UML类图


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

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

  • 意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

  • 优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

  • 缺点:多层装饰比较复杂。

2. 示例

  • 下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
  • 创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。RedShapeDecorator 是实现了 ShapeDecorator 的实体类。

'''Decorator Pattern with Python Code
'''from abc import abstractmethod, ABCMeta# 创建一个形状接口
class Shape(metaclass=ABCMeta):@abstractmethod def draw(self):pass# 创建圆形实体类
class Circle(Shape):def draw(self): print("Shape: Circle")# 创建矩形实体类
class Rectangle(Shape):def draw(self):print("Shape: Rectangle")# 创建实现了 Shape 接口的抽象装饰类
class ShapeDecorator(Shape):decoratedShape = Nonedef __init__(self, decoratedShape):self.decoratedShape = decoratedShapedef draw(self):self.decoratedShape.draw()# 创建扩展了 ShapeDecorator 类的实体装饰类
class RedShapeDecorator(ShapeDecorator):def __init__(self, decoratedShape):ShapeDecorator.__init__(self, decoratedShape)   def draw(self):self.decoratedShape.draw()   self.setRedBorder(self.decoratedShape)def setRedBorder(self, decoratedShape):print("Border Color: Red")class Client(object):def main(self):circle = Circle()redCircle = RedShapeDecorator(Circle())redRectangle = RedShapeDecorator(Rectangle())print("Circle with normal border")circle.draw()print("\nCircle of red border")redCircle.draw()print("\nRectangle of red border")redRectangle.draw()if __name__ == '__main__':Client().main()

输出:

# ./Decorator.py
Circle with normal border
Shape: CircleCircle of red border
Shape: Circle
Border Color: RedRectangle of red border
Shape: Rectangle
Border Color: Red

参考:
https://www.runoob.com/design-pattern/decorator-pattern.html

python设计模式9-装饰器模式相关推荐

  1. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  2. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  3. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  4. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  5. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

  6. 零基础学习设计模式之装饰器模式(配套视频)

    零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...

  7. 详解设计模式:装饰器模式

    装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式.装饰器模式 是指在不改变原有对象的基础之上,将 ...

  8. javascript设计模式之装饰器模式(结构型模式)

    javascript设计模式之装饰器模式 js的设计模式分为创建型模式,结构型模式和行为模式 结构模式描述了如何组合对象以提供新的功能. 装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础 ...

  9. 设计模式之装饰器模式详解

    设计模式之装饰器模式详解 文章目录 设计模式之装饰器模式详解 一.什么是装饰器模式 二.装饰器模式的角色组成 三.装饰器模式通用写法示例 四.装饰器模式业务中的应用举例 五.装饰器模式优缺点 一.什么 ...

  10. python 装饰器 继承_Python设计模式之装饰器模式

    装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 注意,本文中的Decorat ...

最新文章

  1. python获取数据类型_python数据类型详解
  2. 洛谷P4480 【[BJWC2018]餐巾计划问题】
  3. 计算机控制技术中传感器,计算机控制技术论文
  4. ios -使用NSLayoutConstraint实现多个view等宽等高等间距
  5. libevent中指定使用哪种方法如select
  6. matlab如何响两声,matlab发出声音
  7. MySQL 错误 #1055
  8. 【超全解析】原码、反码、补码、移码的相互转化和解读(取值范围)
  9. 等待的操作过时_不会过时的6种网站seo优化操作
  10. PHP里的“夏令虫”
  11. 细心微服务架构的优势与不足那点事
  12. 工业界中NLP(自然语言处理)算法工程师的核心竞争力是什么?
  13. SqlServer配置身份验证登录教程
  14. AOPlog4j2propagation的7种事务配置
  15. Firewalld ip伪装和端口转发
  16. 相控阵天气雷达工作原理
  17. excel更改页眉页脚_如何在Excel的页眉和页脚中键入“&”号
  18. 云服务器修改虚拟内存,云服务器可以设置虚拟内存
  19. SEO优化之og:标签
  20. NRS1800 芯片使用技巧(一)

热门文章

  1. LAMP+LNMP(一) LAMP架构概述
  2. linux stat命令详解
  3. 浏览器了解(三)CSS解析
  4. MySQL prepare语句的SQL语法
  5. [转]Android Service Test——简单测试例子
  6. Web应用——焦点图自动浏览
  7. MVC设计模式-学习笔记
  8. 「镁客·请讲」Visense Studio冯樑杰:游戏基因的VR视频,最好的表现是真人实拍交互...
  9. MVVM架构之自动增删改的极简RecycleView的实现
  10. 销售额分布直方图和茎叶图