装饰模式

Python何时执行装饰器

匿名 (未验证) 提交于 2019-12-02 22:51:30
装饰器的一个关键特性是,它们在被装饰的函数定义之后立即运行。这 通常是在导入时(即 Python 加载模块时),如示例 7-2 中的 registration.py 模块所示。   示例 7-2 registration.py 模块 registry = [] def register(func): print('running register(%s)' % func) registry.append(func) return func @register def f1(): print('running f1()') @register def f2(): print('running f2()') def f3(): print('running f3()') def main(): print('running main()') print('registry ->', registry) f1() f2() f3() if __name__ == '__main__': main() 运行结果 running register(<function f1 at 0x0000027913AA8708>) running register(<function f2 at 0x0000027913AA8E58>) running main() registry -> [

python 单例装饰器

匿名 (未验证) 提交于 2019-12-02 22:51:30
Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性。 单例模式定义:具有该模式的类只能生成一个实例对象。 def singlecls(cls, *args,**kwargs):   instace = {}   def get_instance(cls, *args, **kwargs):     if cls not in instace:       instances[cls] = cls(*args, **kwargs)     return instance[cls]   return get_instace      @singlecls class A(object):   def __init__(self):     pass A = singlecls(A) 在创建实例对象时会先将 A 作为参数传入到 singlecls 函数中,函数在执行过程中不会执行 get_instance 函数(函数只有调用才会执行),直接返回get_instance函数名。 此时可以看作 A = get_instance,创建实例时相当于 a= get_instance(),调用get_instance 函数,先判断实例是否在字典中,如果在直接从字典中获取并返回, 如果不在执行 instances

装饰器的完整实现及原理

匿名 (未验证) 提交于 2019-12-02 22:11:45
1、简单装饰器 print (foo. __closure__ [0].cell_contents) <function foo at 0x000001F2C7465620> 装饰之前: <function foo at 0x000002569AAB5620 > foo this is foo 装饰之后: <function check_result.<locals>.wrapper at 0x00000250E11F56A8 > wrapper this is wrapper 1 ''' 2 简单装饰器: 3 实现装饰后函数的功能是如果x和y相乘为负数,则返回0 4 ''' 5 6 def check_result(func): 7 '''hahah''' 8 def wrapper(*args, **kwargs): 9 '''this is wrapper''' 10 result = func(*args, **kwargs) 11 12 if result < 0: 13 return 0 14 else: 15 return result 16 return wrapper 17 18 19 @check_result 20 def foo(x, y): 21 '''this is foo''' 22 return x * y 23 24 25 26 27 #

.NET Core/.NET之Stream简介

匿名 (未验证) 提交于 2019-12-02 22:10:10
之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core/.NET的Streams 首先需要知道, System.IO命名空间是低级I/O功能的大本营. Stream的结构 装饰器 , 适配器. backing stores是让输入和输出发挥作用的端点, 例如文件或者网络连接. 就是下面任意一点或两点: 一个源, 从它这里字节可以被顺序的读取 一个目的地, 字节可以被连续的写入. 程序员可以通过Stream类来发挥backing store的作用. Stream类有一套方法, 可以进行读取, 写入, 定位等操作. 个数组不同的是, 数组是把所有的数据都一同放在了内存里, 而stream则是顺序的/连续的处理数据, 要么是一次处理一个字节, 要么是一次处理特定大小(不能太大, 可管理的范围内)的数据. 于是, stream可以用比较小的固定大小的内存来处理无论多大的backing store. 中间的那部分就是装饰器Stream. 它符合装饰模式. 从图中可以看到, Stream又分为两部分: Backing Store Streams: 硬连接到特定类型的backing store, 例如FileStream和NetworkStream Decorator Streams 装饰器Stream

Java IO与装饰者模式整理

匿名 (未验证) 提交于 2019-12-02 21:53:52
IO Java的I/O是实现输入和输出的基础。Java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。这样就可以做到设备、平台无关的。 分类 Java中I/O类分两两类:字节流和字符流。每种又分输入流和输出流。 字节流 字节流 注意:上图中有两个类对其父类有单项关联关系。记住这点,待会儿会讲。 FilterInputStream继承并依赖父类 public class FilterInputStream extends InputStream { /** * The input stream to be filtered. */ protected volatile InputStream in; // ... } FilterOutStream继承并依赖父类 public class FilterOutputStream extends OutputStream { /** * The underlying output stream to be filtered. */ protected OutputStream out; // ... } 字符流 类图 装饰者模式 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 该模式类图如下: 解释: 角色 模式中的作用 IO中对应类 抽象构件角色

Java基础之IO流整理

匿名 (未验证) 提交于 2019-12-02 21:45:52
Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽象基类 字节流:InputStream,OutputStream. 输出流方法: close(), flush(), write(int b), write(byte[] b), write(byte[] b, int off, int len) 输入流方法: close(), abstract int read(), int read(byte[] b) 子类(非装饰流):文件流:FileOutputStream,FileInputStream. 构造方法: FileOutputStream(File file),FileOutputStream(String filename) 构造方法可以添加第二个布尔参数设置是否为追加模式 子类(装饰流):序列化流:ObjectOutputStream,ObjectInputStream 构造方法: ObjectOutputStream(OutputStream out), ObjectInputStream(InputStream in) 输入流序列化方法: writeObject (Object obj) 输出流反序列化方法: readObject () 子类

装饰模式

∥☆過路亽.° 提交于 2019-12-02 20:01:27
  装饰模式:动态地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活。(《设计模式》)   即是通过组合给对象增加功能,可以消除通过继承带来的代码重复和大量子类这些麻烦。通常要扩展对象的功能是用继承的方式实现,但是由于继承为类引入静态特征,一旦扩展的功能增多,子类也会随之增多。所以装饰模式主要用在想要 动态扩展功能 的情况下。 实现:   1、创建接口 class Stream { public: virtual void read() = 0; virtual void write() = 0; virtual void seek() = 0; virtual ~Stream() {}; };   2、创建接口的实体类 class FileStream :public Stream { // 通过 Stream 继承 read write seek都是静态特征 virtual void read() override; virtual void write() override; virtual void seek() override; }; class NetworkStream : public Stream { // 通过 Stream 继承 virtual void read() override; virtual void

设计模式---装饰器模式

蓝咒 提交于 2019-12-02 19:03:44
   本篇来讲讲装饰器模式,装饰器也是比较常见的模式,在java的IO中广泛应用。 1、定义   装饰器模式是动态地将责任附加到对象上。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。   以上的定义比较拗口,通俗的讲装饰器是对原有的方法的增强,跟后续要讲的代理模式很像,区别在于代理模式是屏蔽了代理类,装饰器模式注重附加额外的功能。 2、UML   Component:一个接口或者抽象类。 ConcreteComponent:具体的组件实现类。 Decorator:装饰器,通常是抽象类。每个装饰器都有一个组件,是对Component的引用。 ConcreteDecoratorA:具体的装饰器的实现类,继承自装饰器。 ConcreteDecoratorB:具体的装饰器的实现类,继承自装饰器。 3、案例   首先新建抽象类component package com.design_pattern.decorator; public abstract class Component { abstract void show(); }   接着建实现component的子类 package com.design_pattern.decorator; public class ConcreteComponent extends Component { @Override void show

设计模式之笔记

为君一笑 提交于 2019-12-02 16:50:42
设计模式—策略模式 定义:定义一系列的算法,将算法进行封装、隔离、相互独立、又能相互替换 使用场景:第三方支付方式选择、底层多套API的调用 * 支付实现原理: * 1.定义支付服务接口PayService ,里面有一个payHtml方法,供选择某种支付方式 * 2.定义具体的支付方式实现类,例如:阿里支付、微信支付、银行卡支付..。该类继承PayService接口 * 3.定义枚举 PayContentConstant。code是支付别名,className是具体支付方式实现类的类名 * 4.定义支付上下文PayContent,定义一个变量payServiceHashMap用于存储当前所有的支付方式。当Spring扫描该类的时候, * 后将所有的支付方式注入到当前的Map中。定义一个payHtml方法用于让用户选择那种支付方式,根据支付方式去跳转到某一支付页 * * 策略模式条件: * 某一抽象接口服务(支付接口)、N个具体接口服务(具体支付方式)、枚举或者常量(存储支付方式与对应的支付实现关系)、 * 支付上下文(满足用户选择某种支付方式) 设计模式—装饰模式 定义:在不改变原有对象的基础上,扩展很多功能 使用场景:网关+日志记录+接口限流+API鉴权等 * 装饰实现原理: * 1.定义一个厂家Producer ,它具有生产的功能 * 2

python学习笔记之---装饰器

≯℡__Kan透↙ 提交于 2019-12-02 14:58:21
装饰器:也是一种设计模式 decorator 核心作用:给不同的函数(方法用),可以增加不同的公用的功能。 装饰器的标志:带@符号的,如: @classmethod @staticmethod 闭包:函数对象+函数部分所需要使用的一个外部变量=函数 返回的整体。 例子1: #函数对象可以做为返回值返回 def pri(): return sum #函数执行后返回了另外一个函数对象sum print(type(pri())) D:\>py -3 a.py <class 'builtin_function_or_method'> 函数对象:就是函数不加()----sum,如果加()就是函数调用----sum() 例子2: #函数的参数可以使用函数对象 def func1(func): return func([1,2,3]) func1(sum) ''' func1(sum) #--->6 #sum->sum([1,2,3]) #pri-->pri([1,2,3])--->不符合函数定义,会报错 ''' 执行结果: D:\>py -3 a.py <class 'builtin_function_or_method'> Traceback (most recent call last): File "a.py", line 11, in <module> func1(pri) File