装饰模式

【翻译】深入浅出Python装饰器之基本用法

為{幸葍}努か 提交于 2020-01-15 15:57:15
深入浅出Python装饰器 前言 前两天被问到装饰器的概念,在我的理解里:装饰器就是一个函数,他的参数为函数,一般用来对参数进行一些额外的处理,但不影响参数函数的表现。 但说实话写的不多,于是就想查一下资料具体看一下。而前两天发现谷歌设置为中英文,搜索结果的排序都不一样。于是就翻了下英文的资料,看完之后感觉讲的的确不错,就诞生了想尝试翻译一下的想法,于是就有了本文。 老外讲东西太细了,所以有些显而易见的话会被我过滤掉……另外,高级用法暂时未翻。 本文翻译自 Primer on Python Decorators 的第一部分,深入浅出是个人翻译,Primer原义为入门读物,所以也可以翻译为Python装饰器入门指南。 翻译正文 目录 本文的结构如下: 函数 第一类对象(First-Class Objects) 内置函数 返回值为函数的函数 简单的装饰器 语法糖 一个重复使用的装饰器 带参数的装饰器函数 装饰器函数的返回值 你是谁啊?(函数名) 一些真实用例 计时函数 代码调试 减速/延迟执行的代码 插件注册 检查用户是否登陆的装饰器 华丽的装饰器/装饰器的高级用法 装饰类 多重装饰器 带参装饰器 多功能装饰器(带参不带参均可) 含有状态的装饰器 另外一些真实用例 减速/延迟执行的代码 单例模式的实现 缓存返回值 向单元里添加信息 验证JSON是否合理 总结 深入阅读 另:此文有配套

”万丈高楼平地起“——如何从“建筑师”角度打造【装饰者设计模式】

孤者浪人 提交于 2020-01-15 12:56:14
什么是装饰者模式 在 不改变原有对象 的基础上 附加功能 ,相比生成子类更灵活。 装饰者模式应用场景 过滤器,网关控制,P2P分控审批 装饰者模式类图 装饰者模式定义 (1)抽象组件:定义一个抽象接口,来规范准备附加功能的类 (2)具体组件:将要被附加功能的类,实现抽象构件角色接口 (3)抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口 (4)具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。 装饰者代码实现 定义一个抽象的接口 /** * 定义【抽象构建角色】:GatewayComponent * GatewayComponent:相当与建筑师设计好高楼的建造目标 */ public abstract class GatewayComponent { /** * 定义共同行为的方法标准 */ public abstract void service(); } 定义被装饰角色 /** * 【网关获取基本参数】,BasicComponentGateway【被装饰的类】 * BasicComponentGateway:相当于建房子的【地基】 */ public class BasicComponentGateway extends GatewayComponent { public void service() { System.out.println(

Head First——装饰模式

非 Y 不嫁゛ 提交于 2020-01-15 08:48:43
定义 装饰者模式动态地将责任附加到对象上。 若要扩展功能,装饰者提供了比继承更有弹性 的替代方案。 意义 通过动态地组合对象,可以写新的代码添加新功能,而无须修改现有代码。既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少 用组合(composition)和委托(delegation)可以在 运行时具有继承行为的效果,来代替继承 代码实现 1. 抽象构件 public abstract class AbstractBeverage { public String description = "UnKnow beverage" ; public String getDescription ( ) { return description ; public abstract double cost ( ) ; } 2. 具体构件类 public class HouseBlend extends AbstractBeverage { public HouseBlend ( ) { description = "HouseBlend" ; } @Override public double cost ( ) { return 1.1 ; } } 3. 抽象装饰类 public abstract class AbstractCondimentDecorator

java设计模式之 装饰器模式

戏子无情 提交于 2020-01-14 13:43:34
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,动态给一个对象添提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。模拟一个人从想吃饭、找饭店、享受美食、结束吃饭的过程 代码展示: 首先创建一个被修饰的接口 Eat package decorator; //吃饭接口 public interface Eat { //吃饭方法 void eat(); } 创建一个被修饰者并且有自己的状态 package decorator; public class Person implements Eat { @Override public void eat() { System.out.println("======我饿了======"); } } 创建一个修饰者的抽象类 package decorator; public abstract class LikeEat implements Eat { private Eat eat; public LikeEat(Eat eat) { this.eat=eat; } @Override public void eat() {

装饰模式

江枫思渺然 提交于 2020-01-13 16:42:37
一、装饰模式 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 将不同的装饰功能,即需要向原有类添加的功能集成于不同的类当中,让这个类包装所要修饰的对象。 那么当需要有顺序地执行特殊的行为时,就可以采用装饰模式了。 二、实现思路 abstract class Component{ public abstract void operation(); } //原有类 class ConcreteComponent extends Component{ @Override public void operation() { System.out.println("具体对象的操作"); } } //装饰类 class Decorator extends Component{ protected Component component; //将需要装饰的类设置进Decorator public void setComponent(Component component){ this.component=component; } //执行原有操作 @Override public void operation() { if (component!=null){ component.operation(); } } } class

结构型设计模式之装饰模式(Decorator)

爱⌒轻易说出口 提交于 2020-01-13 16:36:59
结构 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活。 适用性 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 处理那些可以撤消的职责。 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 1 using System; 2 3 abstract class Component 4 { 5 public abstract void Draw(); 6 } 7 8 class ConcreteComponent : Component 9 { 10 private string strName; 11 public ConcreteComponent(string s) 12 { 13 strName = s; 14 } 15 16 public override void Draw() 17 { 18 Console.WriteLine("ConcreteComponent - {0}", strName); 19 } 20 } 21 22 abstract class Decorator : Component 23 { 24 protected

修饰者模式

大憨熊 提交于 2020-01-13 07:15:57
1、 装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。 2、组合和继承的区别 继承 。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。 组合 。组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。这是一种动态的方式,我们可以在应用程序中动态的控制。 与继承相比,组合关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但是它的缺点就在于要创建比继承更多的对象。 3、装饰者模式的优缺点 优点 1、装饰者模式可以提供比继承更多的灵活性 2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。 3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。 4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。 缺点 1、会产生很多的小对象,增加了系统的复杂性 2、这种比继承更加灵活机动的特性

并行编程概述

ⅰ亾dé卋堺 提交于 2020-01-12 15:27:38
并发编程 多线程之——threa模块 >>> import time >>> time.ctime() 'Thu Jan 9 07:52:57 2020' import time """单线程示例 """ def worker(n): print(f'函数执行开始于:{time.ctime()}') time.sleep(n)#休眠时间 print(f'函数执行结束于:{time.ctime()}') def mian(): print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串 worker(4)#执行4秒 worker(2)#执行2秒 print(f'【主函数执行结束于:{time.ctime()}】') if __name__ == '__main__': mian()   结果 【主函数执行开始于:Thu Jan 9 08:00:57 2020】 函数执行开始于:Thu Jan 9 08:00:57 2020 函数执行结束于:Thu Jan 9 08:01:01 2020 函数执行开始于:Thu Jan 9 08:01:01 2020 函数执行结束于:Thu Jan 9 08:01:03 2020 【主函数执行结束于:Thu Jan 9 08:01:03 2020】  多线程 _thread模式弊端并不能决定函数 程序什么时候结束

装饰者模式

送分小仙女□ 提交于 2020-01-10 14:10:41
概念 定义:在不改变原有对象的基础上,动态的给一个对象添加一些额外的职责 优点: (1)装饰类和被装饰类可以独立发展,不相互耦合 (2)装饰模式是继承关系的一个替代方案 (3)装饰模式可以动态的扩展一个实现类的功能 缺点 (1)多层装饰比较复杂 (2)出现了更多的类,增加了代码的复杂性 使用场景 (1)需要动态的扩展一个类的功能,或给一个类增加附加功能 (2)需要动态的给一个对象增加功能,这些功能可以再动态的撤销 (3)需要为一批兄弟类进行改装或加装功能 代码实现 public abstract class IceShake { public abstract int cost(); public String elements() { return "ice"; } } public class MongoIceShake extends IceShake { @Override public int cost() { return 10; } @Override public String elements() { return super.elements() + ",mongo"; } } public abstract class Decorator extends IceShake { private IceShake iceShake; public

day12

断了今生、忘了曾经 提交于 2020-01-09 14:26:20
目录 一、博客园的使用 二、markdown文档的编写 一级标题 二级标题 三级标题 一、什么是 property特性 二、简单示例 三、 property属性的两种方式 3.1 装饰器 3.2 类属性方式 四、property+类的封装 五、应用 5.1 私有属性添加getter和setter方法 5.2 使用property升级getter和setter方法 5.3 使用property取代getter和setter方法 六、练习 三、计算机基础之编程 什么是编程语言 什么是编程 为什么要编程 四、计算机组成 计算机的基本组成 CPU(大脑) Input/Output设备 输入设备(眼睛/鼻子) 输出设备(X门) 32位和64位 多核CPU 总线(血管/神经) 机械硬盘的工作原理 机械手臂 磁道 扇区 平均寻道(磁道)时间 平均延迟时间(机械手臂寻找数据的时间) 平均寻找数据时间 固态硬盘(了解中的了解) 五、操作系统 什么是文件 什么是应用程序 操作系统有什么用? 计算机的三大组成 应用程序的启动 操作系统的启动 一、博客园的使用 管理 --》 设置 --》 修改博客园样式 管理 --》 选项 --》 修改markdown格式 管理 --》 图片 --》 上传你的图片 二、markdown文档的编写 用来存储内容 word excel jpg MP4 markdown文档