python设计模式之装饰器模式
目录
- 装饰器模式
- python 装饰器语法糖
装饰器模式
装饰器模式解决什么问题?
- 增加新功能,且不改变原有功能和代码
- 选配,根据不同情况,动态调整功能
装饰器,顾名思义,就是用来装饰其他实物,增加被装饰物的功能而不改变被装饰物。这就像我们买车,同一款车型,有很多功能是选配的,但是车的核心功能不变。我们可以在购买时,根据需要选配不同的配置。
如何实现?
想象一下,你是一个装修工,如果要装饰一辆车,那么你首先需要有一辆车,而且在装饰过程中,你不能够改变车原有的功能(接口)。
如类图所示:
- 核心功能Core和所有装饰器都必须实现Interface接口
- 所有装饰器以组合的方式保存接口实例
class Core: def some_action(): pass class Decorator: def __init__(self,core): self.core = core def some_action(): .... self.core.some_action() .....
python 装饰器语法糖
装饰器太常用了,python专门的语法糖简化了装饰器的使用。最外层函数接收一个函数对象并返回内层函数,内层函数是正真的执行函数。
# 装饰器定义 def decorator(func): def wrapper(*args,**kwargs): ..... result = func(*args,**kwargs) .... return result return wrapper # 装饰器使用 @decorator def func(): pass
虽然形式变了,但是实质没有变:保存接口实例,实现相同的接口。
- 保存接口实例容易理解,因为传入了函数func对象。
- 实现相同的接口怎么理解?语法糖@xxxx的操作等价于
func = decorator(func)
,即将内层函数重命名了原函数名。
到此这篇关于python设计模式之装饰器模式的文章就介绍到这了,更多相关python装饰器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
分析Python中设计模式之Decorator装饰器模式的要点
先给出一个四人团对Decorator mode的定义:动态地给一个对象添加一些额外的职责. 再来说说这个模式的好处:认证,权限检查,记日志,检查参数,加锁,等等等等,这些功能和系统业务无关,但又是系统所必须的,说的更明白一点,就是面向方面的编程(AOP). 在Python中Decorator mode可以按照像其它编程语言如C++, Java等的样子来实现,但是Python在应用装饰概念方面的能力上远不止于此,Python提供了一个语法和一个编程特性来加强这方面的功能.Python提供的语法就是
-
python设计模式之装饰器模式
目录 装饰器模式 python 装饰器语法糖 装饰器模式 装饰器模式解决什么问题? 增加新功能,且不改变原有功能和代码 选配,根据不同情况,动态调整功能 装饰器,顾名思义,就是用来装饰其他实物,增加被装饰物的功能而不改变被装饰物.这就像我们买车,同一款车型,有很多功能是选配的,但是车的核心功能不变.我们可以在购买时,根据需要选配不同的配置. 如何实现? 想象一下,你是一个装修工,如果要装饰一辆车,那么你首先需要有一辆车,而且在装饰过程中,你不能够改变车原有的功能(接口). 如类图所示: 核心功能
-
PHP设计模式之装饰器模式定义与用法详解
本文实例讲述了PHP设计模式之装饰器模式定义与用法.分享给大家供大家参考,具体如下: 什么是装饰器模式 作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加"装饰". 适配器模式, 是为现在有结构增加的是一个适配器类,.将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以很好的合作. 装饰器模式是将一个对象包装起来以增强新的行为和责任.装饰器也称为包装器(类似于适配器) 有些设计设计模式包含一个抽象类,而且该抽象类还继承了另一个抽象类,这
-
PHP设计模式之装饰器模式实例详解
本文实例讲述了PHP设计模式之装饰器模式.分享给大家供大家参考,具体如下: 装饰器模式又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. UML类图: 角色: 组件对象的接口:可以给这些对象动态的添加职责 所有装饰器的父类:需要定义一个与组件接口一致的接口,并持有一个Component对象,该对象其实就是被装饰的对象. 具体的装饰器类:实现具体要向被装饰对象添加的功能.用来装饰具体的组件对象或者另外一个
-
PHP设计模式之装饰器模式定义与用法简单示例
本文实例讲述了PHP设计模式之装饰器模式定义与用法.分享给大家供大家参考,具体如下: 装饰器模式: 如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式. 简单点说:就是我们不应该去修改已有的类,而是通过创建另外一个装饰器类,通过这个装饰器类去动态的扩展其需要修改的内容,这样做的好处就是---- 1.我们可以保证类的层次不会因过多而发生混乱. 2.当我们需求的修改很小时,不用改变原有的数据结构. 代码引用自<PHP设计模
-
浅谈Java设计模式系列-装饰器模式
一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的. 而实际上,装饰器模式和代理模式的实现方式基本一致,只在目标的存在上有些差别,这个后面我们具体讲述. 二.初步分析 上面提到了两点: 涉及的是单方 目标是抽象的 我们来想一下,所谓单方主要指的是在整个装饰器模式中不存在双方调用,要解决的也不是双方调用的问题,而是解决单方提供对外服务的问题,这个单方在自行对外提供服务时,功能不足,或
-
Java设计模式之装饰器模式
本文由老王将建好的书房计划请小王来帮忙,小王却想谋权篡位,老王通过教育他引出装饰器设计模式,第二部分针对老王提出的建设性意见实现装饰器模式,第三部分针对装饰器模式在Jdk中的IO.Spring中的缓存管理器.Mybatis的运用来加强我们的理解,第四部分说明装饰器模式和代理模式的区别及他们各自的应用场景. 读者可以拉取完整代码到本地进行学习,实现代码均测试通过后上传到码云,本地源码下载. 一.引出问题 上篇文章(Java设计模式之组合模式)对老王的书架改造以后,老王是相当的满意,看小王能力突出,
-
Java中常用的设计模式之装饰器模式详解
目录 优点 缺点 使用场景 一.实现方式 二.测试 总结 优点 1.装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能. 缺点 2.多层装饰比较复杂. 使用场景 1.扩展一个类的功能. 2.动态增加功能,动态撤销. 一.实现方式 假设一个场景,我们房间每天起床都要刷牙, 睡觉也要刷牙,刷牙的动作就是一个装饰器的作用,这样更利于我们的口腔健康.接下来我们就看看具体的装饰器如何实现. 1.每天生活的接口 package com.asurpl
-
C#设计模式之装饰器模式实例详解
最近踢了场球,9人制比赛,上半场我们采用防守阵型效果不佳,下半场采用进攻阵型取得了比赛的主动.我们上下半场所采取的策略,似乎可以用"装饰器"模式实现一遍. 首先肯定是抽象基类. public abstract class OurStrategy { public abstract void Play(string msg); } 通常,在上半场,我们一般都使用防守阵型. public class OurDefaultStategy : OurStrategy { public over
-
java设计模式之装饰器模式(Decorator)
概述 装饰模式是对客户端以透明的方式扩展对象的功能,是继承关系的一个替代方案.也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同,装饰模式可以在不用创造更多子类的情况下,将对象的功能加以扩展,装饰模式的关键在于这种扩展是完全透明的. 模式的结构 UML类图: 装饰模式中的类角色: 抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象 具体构件角色(Employe):定义一个将要接收附加责任的类 装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接
-
浅析Python装饰器以及装饰器模式
漫谈 如果作为一个Python入门,不了解Python装饰器也没什么,但是如果作为一个中级Python开发人员,如果再不对python装饰器熟稔于心的话,那么可能并没有量变积累到质变. 我以前也看过很多讲python 装饰器的文章,但是都是看了就忘.一方面是没有做太多的练习,二是对它的领会不是很深. 希望引以为戒!!! 郑传 装饰模式 如果你了解Java,你肯定听过 装饰器模式.在面向对象中,装饰模式指:动态地给一个对象添加一些额外的职责.就增加一些功能来说,装饰模式比生成子类更为灵活. 在设计
随机推荐
- 初识php MVC
- Spring内置任务调度如何实现添加、取消与重置详解
- iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码
- Python3实现从文件中读取指定行的方法
- 浅谈Javascript数组的使用
- asp中for循环的使用方法
- C#中foreach循环对比for循环的优势和劣势
- Android编程加密算法小结(AES、Base64、RAS加密算法)
- Android利用WindowManager生成悬浮按钮及悬浮菜单
- js实现编辑div节点名称的方法
- Windows下的PHP 5.3.x安装 Zend Guard Loader教程
- PHP+Tidy-完美的XHTML纠错+过滤
- 详解阿里云Linux启动tomcat并能外网访问
- javascript动态加载二
- javascript与jquery中的this关键字用法实例分析
- 一个Activity中多个Fragment的切换
- 基于MyBatis的简单使用(推荐)
- python+django加载静态网页模板解析
- 使用python装饰器计算函数运行时间的实例
- Spring Security OAuth2 token权限隔离实例解析