装饰模式

装饰器模式,实现aop

倾然丶 夕夏残阳落幕 提交于 2020-01-08 10:40:45
在不改变原来类的基础上,给原来的类的某方法扩展功能 public class DirectorAop { public static void Show() { User user = new User() { Name = "jump", Password="123123" }; Console.WriteLine("原来只干注册的事情"); IUserProcessor userProcessor = new UserProcessor(); userProcessor.RegUser(user); Console.WriteLine("实现aop后,的装饰器模式实现:"); userProcessor = new UserProcessorDirecotr(userProcessor);//装饰了一层 userProcessor.RegUser(user); } } public class User { public string Name { get; set; } public string Password { get; set; } } public interface IUserProcessor { void RegUser(User user); } /// <summary> /// 需要被装饰的类【就是要被扩展功能的类】 /// </summary>

JavaScript——装饰者模式

岁酱吖の 提交于 2020-01-07 22:11:28
今天打算开始系统的学习设计模式,虽然之前有看过《大话设计模式》但但是没能够静下心来写学习笔记导致很多内容都只是有一个概念而不会去应用。这次要记下学习的过程。接下来进入主题。 何为设计模式?设计模式( Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 今天学习的是装饰者模式,该模式是一种结构型的模式,它与对象的创建无关,主要是考虑到如何扩展对象的功能。我们除了使用线性的继承方式,还可以使用创建若干个装饰的对象来扩展其功能,当我们面对不同的需求的时候,我们可以用该模式,自行选择不同的装饰器不同的顺序来执行方法。 接下来我们来举个例子,比如说装饰一个圣诞树 ,首先先有一个圣诞树 1 var tree={}; 有了圣诞树之后我们就要装饰它,接下来实现装饰的动作 tree.decorate=function(){ console.log('this is a tree'); } 动作有了,但是还没有被装饰的物件(装饰器)接下来创建几个属于圣诞树的装饰品 tree.BlueBalls=function(){ this.decorate=function(){ this.BlueBalls.prototype

Python装饰器与面向切面编程

断了今生、忘了曾经 提交于 2020-01-07 18:25:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天来讨论一下装饰器。装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。 1. 装饰器入门 1.1. 需求是怎么来的? 装饰器的定义很是抽象,我们来看一个小例子。 1 2 3 4 def foo(): print 'in foo()' foo() 这是一个很无聊的函数没错。但是突然有一个更无聊的人,我们称呼他为B君,说我想看看执行这个函数用了多长时间,好吧,那么我们可以这样做: 1 2 3 4 5 6 7 8 import time def foo(): start= time.clock() print 'in foo()' end= time.clock() print 'used:', end- start foo() 很好,功能看起来无懈可击。可是蛋疼的B君此刻突然不想看这个函数了,他对另一个叫foo2的函数产生了更浓厚的兴趣。 怎么办呢?如果把以上新增加的代码复制到foo2里,这就犯了大忌了~复制什么的难道不是最讨厌了么!而且,如果B君继续看了其他的函数呢? 1.2. 以不变应万变

Python装饰器与面向切面编程

你。 提交于 2020-01-07 16:43:43
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 新年好~ 那么,很久没有更新了,其实想想也没多少可以写的,因为Python的文档似乎很全面的说……能做的差不多只有翻译和整理了,英文过关的朋友不妨直接去doc.python.org这里查看相关资料 :) 转载请注明原作者和原文地址,多谢! 今天来讨论一下装饰器。装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。 1. 装饰器入门 1.1. 需求是怎么来的? 装饰器的定义很是抽象,我们来看一个小例子。 def foo(): print 'in foo()' foo() 这是一个很无聊的函数没错。但是突然有一个更无聊的人,我们称呼他为B君,说我想看看执行这个函数用了多长时间,好吧,那么我们可以这样做: import time def foo(): start = time.clock() print 'in foo()' end = time.clock() print 'used:', end - start foo() 很好,功能看起来无懈可击。可是蛋疼的B君此刻突然不想看这个函数了

【python学习笔记】装饰器、functools.wraps装饰器和functools.partial偏函数

感情迁移 提交于 2020-01-07 16:26:28
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、装饰器 不修改被装饰函数的定义,但是可以在代码运行期间动态增加功能的方式,称之为“装饰器“, 本质上,装饰器decorator就是一个返回函数的高阶函数 #!/usr/bin/env python #-*- coding:utf-8 -*- import math# 导入数学公式模块 from collections import Iterable# 判断是否为可迭代对象 import os# 导入os模块 import functools# 导入functools.wraps # Python将一切视为object的子类,即一切都是对象,当然函数也是一个对象,可以像变量一样被传递和指向 def foo(): print "I`m foo" f = foo f() # 函数对象有一个__name__的属性,可以得到函数的名字 print foo.__name__ print f.__name__ # ★不修改被装饰函数的定义,但是可以在代码运行期间动态增加功能的方式,称之为“装饰器“, # 例子:在函数调用前后自动打印日志 def logging1(func):# 装饰器函数logging1 def wrapper(*args, **kw):# 可变参数和关键字参数 print '%s is running

flask之路由详解

爱⌒轻易说出口 提交于 2020-01-06 22:04:22
目录 一、路由的本质 二、CBV 2.1 使用views.MethodView类 2.2 指定响应的请求方式类型 2.3 指定装饰器修饰 三、路由参数 四、路由转换器 4.1 自定义转换器 一、路由的本质 flask的路由直接在函数上使用装饰器的话非常的乱,那可不可以想django一样把路由都写到一起呢。 查看源码,我们知道 原来的路由就是一个装饰器 ,装饰器的第一个参数就是路由规则 实际上在 装饰器内的闭包函数最终调用的是 def add_url_rule(self,rule,endpoint=None,view_func=None,provide_automatic_options=None,**options): ''' rule:路由规则 endpoint:反向解析别名,和CBV中as_view(name=...)的name是一样的。因为在源码内部,实际上也会去取参数view_func的__name__也就是指定的函数或类的名字 view_func:响应对象 ''' 因此我们可以直接改写路由。 将原来装饰器修饰的路由,改写为使用 add_url_rule 的路由 from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "ok" if __name__ == '_

修饰者模式(装饰者模式,Decoration)

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

Kotlin设计模式实现之装饰者模式(Decorator)

你离开我真会死。 提交于 2020-01-02 09:39:59
前言 今天是2020年的第一天,在这里祝大家元旦快乐!之前用 kotlin实现了策略模式 ,文中写到要多写几篇文章来加深以下对设计模式的理解。那么今天要写的看题目应该就知道了:装饰者模式(也叫装饰模式)。下面是装饰者模式的定义: 装饰者模式(Decorator) :在不改变对象自身的基础上,动态地给一个对象添加一些额外的职责。与继承相比,装饰者是一种更轻便灵活的做法。若要扩展功能,装饰者提供了比继承更有弹性的替代方法。 故事场景 小星刚毕业,到一家公司实习。今天来到公司后,一如既往地开始编写它的增删改查。 刚刚坐下打开电脑,技术锦鲤走了过来,小星内心开始发牢骚(锦鲤来干啥,每回它来都没好事)。锦鲤告诉小星,公司想要编写一个卖咖啡的系统,有不同种类的咖啡,需要能计算出咖啡的钱和区分咖啡的类别。 小星:没问题,很简单。 十分钟后,小星写出了它的第一版代码: 咖啡的基类: abstract class Beverage(var description: String = "Unknown Beverage") { //描述 open fun getDescriptions():String{ return description } //价钱 abstract fun cost():Double } 其他咖啡(子类): /** * 深度烘焙咖啡(星巴克) * * @author

Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

北战南征 提交于 2020-01-02 01:09:13
生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: 执行效果如下: 可以看到没有任何的结果输出,这说明程序已经可以顺利执行。对于迭代器来讲需要用next()方法来获取值,修改主函数为以下情况可以打印输出前4个整数的立方数: 输出结果如下: 到此可以看到,生成器生成的值需要使用next()方法一个一个的取,它不会一次性生成所有的计算结果,只有在取值时才调用,这时程序会返回计算的一个值且程序暂停;下一次取值时从上一次中断了的地方继续往下执行。 以取出前3个值为例,下图为生成器代码解析图: 图解

Python核心编程的四大神兽

ε祈祈猫儿з 提交于 2020-01-02 01:08:50
本文将主要分为4大部分,分别介绍Python核心编程中的迭代器、生成器 、闭包以及装饰器。 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: def lifang_ls(): """求1-10所用整数的立方数-列表方式实现""" ls = [] for i in range(1,11): result = i ** 3 ls.append(result) print(ls) if __name__ == '__main__': lifang_ls() 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: def lifang_generate(): """求1