python设计模式9-装饰器模式
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-装饰器模式相关推荐
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 设计模式学习----装饰器模式
这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...
- 【设计模式】装饰器模式的使用
问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...
- go设计模式之装饰器模式
go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...
- 零基础学习设计模式之装饰器模式(配套视频)
零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...
- 详解设计模式:装饰器模式
装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式.装饰器模式 是指在不改变原有对象的基础之上,将 ...
- javascript设计模式之装饰器模式(结构型模式)
javascript设计模式之装饰器模式 js的设计模式分为创建型模式,结构型模式和行为模式 结构模式描述了如何组合对象以提供新的功能. 装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础 ...
- 设计模式之装饰器模式详解
设计模式之装饰器模式详解 文章目录 设计模式之装饰器模式详解 一.什么是装饰器模式 二.装饰器模式的角色组成 三.装饰器模式通用写法示例 四.装饰器模式业务中的应用举例 五.装饰器模式优缺点 一.什么 ...
- python 装饰器 继承_Python设计模式之装饰器模式
装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 注意,本文中的Decorat ...
最新文章
- python获取数据类型_python数据类型详解
- 洛谷P4480 【[BJWC2018]餐巾计划问题】
- 计算机控制技术中传感器,计算机控制技术论文
- ios -使用NSLayoutConstraint实现多个view等宽等高等间距
- libevent中指定使用哪种方法如select
- matlab如何响两声,matlab发出声音
- MySQL 错误 #1055
- 【超全解析】原码、反码、补码、移码的相互转化和解读(取值范围)
- 等待的操作过时_不会过时的6种网站seo优化操作
- PHP里的“夏令虫”
- 细心微服务架构的优势与不足那点事
- 工业界中NLP(自然语言处理)算法工程师的核心竞争力是什么?
- SqlServer配置身份验证登录教程
- AOPlog4j2propagation的7种事务配置
- Firewalld ip伪装和端口转发
- 相控阵天气雷达工作原理
- excel更改页眉页脚_如何在Excel的页眉和页脚中键入“&”号
- 云服务器修改虚拟内存,云服务器可以设置虚拟内存
- SEO优化之og:标签
- NRS1800 芯片使用技巧(一)