【python】装饰模式

【python】简单工厂模式
【python】策略模式
【python】装饰模式


文章目录

  • 【python】装饰模式
  • 摘要
  • 一、装饰模式的官方解释
  • 二、私人解释
  • 三、优缺点
  • 四、图与代码
    • 1.UML类图
    • 2.python代码
      • 输出如下:
    • 3.应用代码
      • 输出如下:
  • 总结

摘要

抽空学习下常见的20几种设计模式,python2.7来设计实现。基本就根据某设计模式书籍来实现python版本。希望能坚持下来全部介绍完。设计模式介绍中可能会涉及到一些UML类图,忘了的可以看一下https://blog.csdn.net/zhaxun/article/details/124048871


一、装饰模式的官方解释

23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

二、私人解释

动态地给一个对象添加一些额外的职责,听起来是不是和hook很像。本质上也是一种hook方式。

三、优缺点

优点
1 Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
2 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
缺点
1 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
2 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
3 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。

四、图与代码

1.UML类图

2.python代码

代码如下:

# encoding: utf-8class Component(object):def operation(self):raise NotImplementedErrorclass ConcreteComponent(Component):def operation(self):print '具体对象的操作'class Decorator(Component):def __init__(self):self._component = Nonedef set_component(self, component):self._component = componentdef operation(self):if self._component is not None:self._component.operation()class ConcreteDecoratorA(Decorator):def __init__(self):self._added_state = '本类ConcreteDecoratorA的独有功能,以区别于ConcreteDecoratorB'  # 本类的独有功能,以区别于ConcreteDecoratorBsuper(ConcreteDecoratorA, self).__init__()def operation(self):super(ConcreteDecoratorA, self).operation()  # 首先运行基类的operation,再执行本类的功能print self._added_stateprint '具体装饰对象A的操作', self._added_stateclass ConcreteDecoratorB(Decorator):def operation(self):super(ConcreteDecoratorB, self).operation()  # 首先运行基类的operation,再执行本类的功能self._add_behavior()print '具体装饰对象B的操作'def _add_behavior(self):  # 本类的独有功能,以区别于ConcreteDecoratorAprint '本类ConcreteDecoratorB的独有功能,以区别于ConcreteDecoratorA'if __name__ == '__main__':c = ConcreteComponent()d1 = ConcreteDecoratorA()d2 = ConcreteDecoratorB()d1.set_component(c)d2.set_component(d1)d2.operation()

输出如下:

具体对象的操作
本类ConcreteDecoratorA的独有功能,以区别于ConcreteDecoratorB
具体装饰对象A的操作 本类ConcreteDecoratorA的独有功能,以区别于ConcreteDecoratorB
本类ConcreteDecoratorB的独有功能,以区别于ConcreteDecoratorA
具体装饰对象B的操作

3.应用代码

例如用衣服去装饰某一个人,代码如下:

# encoding: utf-8class Component(object):def show(self):raise NotImplementedError# Person类(ConcreteComponent)
class Person(Component):def __init__(self, name):self._name = namedef show(self):print '装扮的' + self._name# 服饰类(Decorator)
class Finery(Component):def __init__(self,):self._component = Nonedef decorate(self, component):self._component = componentdef show(self):self._component and self._component.show()# 具体服饰类(ConcreteDecorator)
class TShirts(Finery):def show(self):print '大T恤'super(TShirts, self).show()class BigTrouser(Finery):def show(self):print '垮裤'super(BigTrouser, self).show()class Cap(Finery):def show(self):print '帽子'super(Cap, self).show()if __name__ == '__main__':person = Person('小李')t_shirts = TShirts()big_trouser = BigTrouser()cap = Cap()print '\n第一种装扮:'t_shirts.decorate(person)cap.decorate(t_shirts)cap.show()print '\n第二种装扮:'cap.decorate(person)big_trouser.decorate(cap)big_trouser.show()

输出如下:

第一种装扮:
帽子
大T恤
装扮的小李

第二种装扮:
垮裤
帽子
装扮的小李


总结

装饰模式是为已有功能动态地添加更多功能的一种方式。将类中装饰功能搬移出去,可以简化原有的类。
tips:装饰器模式与python装饰器
尽管名字类似,但Python的装饰器不是装饰模式的实现。装饰器模式是在静态类型的面向对象的编程语言中使用的设计模式,以允许在运行时将功能添加到对象。Python装饰器在定义时将功能添加到函数和方法中,因此是比装饰器模式类是更高层次的构造。

【python】装饰模式相关推荐

  1. 大话设计模式之装饰模式(python实现)

    大话设计模式之装饰模式 使用场景 定义 装饰模式结构图 python实现装饰模式 代码结构图 优点 使用场景 建造过程不稳定,不确定.把所需的功能按照正确的顺序串联起来进行控制. 新加入的东西仅仅是为 ...

  2. python 图片识别服装_[Python设计模式] 第6章 衣服搭配系统——装饰模式

    题目 设计一个控制台程序,可以给人搭配嘻哈风格(T恤,垮裤,运动鞋)或白领风格(西装,领带,皮鞋)的衣服并展示,类似QQ秀那样的. 基础版本 class Person(): def __init__( ...

  3. Python设计模式-适配器模式

    Python设计模式-适配器模式 基于Python3.5.2,代码如下 #coding:utf-8class ACpnStaff:name = ""id = "" ...

  4. VII python面向对象

    以下概念及举例均在python3.*中实现: 1. 面向过程&面向对象: op oo 产生背景 科学计算为目标的必然产物 软件应用领域的扩张和系统膨胀之后应运而生 编程方法 自顶向下 自底向上 ...

  5. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  6. 设计模式 — 结构型模式 — 装饰模式

    目录 文章目录 目录 装饰模式 应用场景 代码示例 装饰模式 装饰模式,指的是在不需要改变原类和使用继承的情况下,动态地扩展一个对象的功能.它通过创建一个包装对象,也就是 Python 中的装饰器来包 ...

  7. java好还是python好-学Python 好还是java 好?

    说实话python和java各有各的优点,经过python这几年的快速发展,现在的市场其实很明朗了,python其实更加适合于爬虫机器学习人工智能领域,但是java还是偏向于工程性的领域,所以领域不同 ...

  8. python语言编程模式是啥-Python的设计模式编程入门指南

    有没有想过设计模式到底是什么?通过本文可以看到设计模式为什么这么重要,通过几个Python的示例展示为什么需要设计模式,以及如何使用. 设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的 ...

  9. php和python对比-PHP、Python和Javascript的装饰器模式对比

    修饰模式(Decorator Pattern),又叫装饰者模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式.就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个 ...

最新文章

  1. Docker容器入门-基本命令的使用
  2. 算法小论——第三章 又把新桃换旧符
  3. 理论计算机科学中最令人困惑的谜题之一被解开
  4. 解决github很慢的问题
  5. [linux]windows无法访问samba的安全性问题(关闭selinux)
  6. 关于 Node.js scoped module 的一些理解
  7. 对python的功能和扩展功能的认知_Python基础-基础认知和库了解
  8. 《编程能力基础》刷题笔记(41 题)
  9. Java集合里面的值唯一_java 判断集合元素唯一的原理
  10. easyui 图标下拉框
  11. 中山大学计算机学院离散数学,《离散数学》课程习题与解答(2011级使用)中山大学计算机科学系_推荐.pdf...
  12. lidar/imu组合slam相关文章
  13. 深信服虚拟服务器大融合,从虚拟化向云计算转型 深信服选择了超融合
  14. 【LuoguP4770】[NOI2018] 你的名字
  15. Docker 教程:如何将Helix QAC作为容器创建并运行 上
  16. 古代的人才选拔,哪种制度更好?
  17. 身份证到期,异地换领流程记录
  18. 拼多多Temu如何批量养国外买家账号进行拉新?
  19. mybatis(二)xml配置文件详细说明
  20. Python包下载常用whl文件汇总:最全的Python whl集合

热门文章

  1. 全国信息竞赛语言有python吗_2019年全国信息学竞赛有哪些
  2. ConvertUtils
  3. 网站后台万能密码/10大常用弱口令
  4. 云计算平台建设总体技术方案
  5. 交通流预测爬坑记(二):最简单的LSTM预测交通流,使用tensorflow2实现
  6. ​Podman Desktop: 一款超高颜值和功能强大的 Podman 桌面管理工具
  7. java用calendr做个日历,calendR :为你定制私人专属日历
  8. Ubuntu安装MySQL(RPM包安装)
  9. CFileDialog 和 CFileDialog构造函数
  10. react-native报错-Unable to resolve module ‘react’