装饰器与子类化

WB

Decorator装饰器模式

Intent意图:Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. 为一个对象动态地附加额外的职责。除了子类化这个方案以外,装饰器模式为扩展代码功能提供了另一个灵活的备选方案。

STST

子类化是首选
如果子类化会导致类的数量急剧上升,那就采用这个模式,很管用的一个模式

因为扩展功能,最自然的方式是子类华,没有有力的说服力的前提下,设计应该采用最自然的方式,这是我的理解

MB

如果子类化会导致类的数量急剧上升,那换成装饰器,不也会造成装饰器类数量急剧上升吗

STST

装饰器的数量上升是线性的

而子类话可能是积数的

MB

哦?

STST

比如:

苹果 -〉 红苹果,白苹果,大苹果,小苹果

以及 -〉 红大苹果,红小苹果,白大苹果,白小苹果

装饰的话:只需要红,白,大,小4种装饰
子类话的:需要8种子类才能完成

STST

这只是颜色和大小上分类,如果再加上[好坏]分类的话

装饰需要:红,白,大,小,好,坏 6种装饰器,线性增长

而子类话的话就多了,级数增长

STST

装饰的一个目的就是为了控制类数量的增长速度,了解一点算法复杂度的情况下,线性增长和级数增长可不是一点点的差别

时间: 2024-12-24 19:52:11

装饰器与子类化的相关文章

JS 装饰器,一篇就够

更多文章,请在Github blog查看 在 ES6 中增加了对类对象的相关定义和操作(比如 class 和 extends ),这就使得我们在多个不同类之间共享或者扩展一些方法或者行为的时候,变得并不是那么优雅.这个时候,我们就需要一种更优雅的方法来帮助我们完成这些事情. 什么是装饰器 Python 的装饰器 在面向对象(OOP)的设计模式中,decorator被称为装饰模式.OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持 OOP 的 decorator 外,直接从语法层次

python函数装饰器详解

基础:函数装饰器的表现方式 假如你已经定义了一个函数funcA(),在准备定义函数funcB()的时候,如果写成下面的格式: @funcA def funcB():... 表示用函数funcA()装饰函数funcB().当然,也可以认为是funcA包装函数funcB.它等价于: def funcB():... funcB = funcA(funcB) 也就是说,将函数funcB作为函数funcA的参数,funcA会重新返回另一个可调用的对象(比如函数)并赋值给funcB. 所以,funcA要想作

Go的魅力, 函数式(柯里化, 闭包, 高阶函数), [email protected]装饰器, 封装

Go朴实无华的代码风格是函数式的无尽魅力. 函数式有3个别名, 高大上的"柯里化", 编程语言的"闭包", 数学气息的"高阶函数". Python没有Go的func匿名函数, 但是具有可爱的语法糖(@装饰器). 编程语言都是相通的, 层层封装造就了灵活的风格. 理解了Go的"函数式", 再理解内嵌/接口/重写(设计模式), 剩下的是各个领域的工具了, 就可以写出服务于业务的代码. 感悟于 函数式 http://www.jian

python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化

函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面的冒号必不可少 函数体相对于def关键字必须保持一定的空格缩进 Python允许嵌套定义函数 在定义函数时,开头部分的注释并不是必需的,但是如果为函数的定义加上这段注释的话,可以为用户提供友好的提示和使用帮助. Python是一种高级动态编程语言,变量类型是随时可以改变的.Python中的函数和自定

柯里化与python装饰器

当需要对已定义的函数进行功能扩展但又不能去改变原有函数时就会用到装饰器.装饰器在python中是非常常用且重要的功能,是一种python的语法糖. 在理解装饰器之前先看下面的加法函数: def add(x,y): return x + y 若想增加信息输出功能: def add(x,y): prtint("output") return x + y 这样修改耦合太高,并且侵入了原有的业务代码.我们可以改成这样: def add(x,y): return x + y def test(f

python使用装饰器@函数式化django开发

django是一个python web开发的框架.作为一个框架MVC的架构已经实现起来了.但是编码的时候你经常要进行进一步的抽象. AOP是一种称为面向切面的开发思想,意思是将部分功能代码在运行时动态的加载到指定位置.最常见的应用是Spring中的依赖注入@Autowired. 而装饰器也可以被看成是一种AOP的实现,但是又有些许的不同,让我们来体会一下. 在我们的实例中我们将django中的views.py(其实是controller层)拆出了implement.py(实现)和decorato

IOS设计模式之二(门面模式,装饰器模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 门面(Facade)模式(译者注:facade有些书籍译为门面,有些书籍译为外观,此处译为门面) 门面模式针对复杂的子系统提供了单一的接口,不需要暴漏一些列的类和API给用户,你仅仅暴漏一个简单统一的API. 下面的图解释了这个概念: 这个API的使用者

【设计模式】之装饰器模式

为什么会有装饰模式? 装饰模式是为了解决继承强依赖性和出现大量子类不方便管理问题而出现的.   1. 概述 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数.装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法.修饰类必须和原来的类有相同的接口. 2. 模式中的角色 2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态

Java装饰器模式

意图:动态的将责任附加到对象上什么时候使用:1.在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责2.处理那些可以撤销的职责3.当不能采用生成子类的方式进行扩充时结构图: package com.test.patten.decorator; public interface Person { void doCoding(); } package com.test.patten.decorator; public class Employee implements Person { @