装饰模式

装饰模式

一个人想着一个人 提交于 2019-12-03 05:02:07
老爸一看成绩单, 听我这么一说, 非常开心, 儿子有进步呀, 从40多名进步到30多名,进步很大, 躲过了一顿海扁。 想想看, 如果我还要增加其他的修饰条件, 是不是就非常容易了, 只要实现Decorator类就可以了! 这就是装饰模式。17.2 装饰模式的定义装饰模式(Decorator Pattern) 是一种比较常见的模式, 其定义如下: Attach additionalresponsibilities to an object dynamically keeping the same interface.Decorators provide a flexiblealternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说, 装饰模式相比生成子类更为灵活。 )装饰模式的通用类图如图17-5所示。图17-5 装饰模式的通用类图在类图中, 有四个角色需要说明:● Component抽象构件Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象, 如上面的成绩单。注意 在装饰模式中, 必然有一个最基本、 最核心、 最原始的接口或抽象类充当Component抽象构件。● ConcreteComponent

《设计模式》之装饰器模式

筅森魡賤 提交于 2019-12-03 04:28:19
装饰器模式 装饰器模式中主要有两个角色: 装饰器(夹克,帽子) 被装饰的对象(老王) 装饰器和被装饰的对象有两个特点,也是装饰器模式的关键: 他们实现同一个接口 装饰器中使用了被装饰的对象 使用: /** * <p> *定义一个接口 * </p> * * @author aodeng-低调小熊猫 * @since 19-7-11 */ public interface Person { /** * 计算累计消费 * @return */ public Double cost(); /** * 输出信息 */ public void show(); } /** * <p> *老王( 被装饰的对象 )实现定义的接口 * </p> * * @author aodeng-低调小熊猫 * @since 19-7-11 */ public class LaoWang implements Person{ @Override public Double cost() { //没消费,消费为0 return 0.0; } @Override public void show() { System.out.println("老王我现在消费"+this.cost()); } } /** * <p> *装饰器超类,和被装饰的对象实现同一个接口 Person : * </p> * * @author

python---闭包和装饰器

倖福魔咒の 提交于 2019-12-03 01:54:08
1、参考博客:https://www.cnblogs.com/3me-linux/p/6761635.html 2、闭包 def outer(): x = 1 def inner(): print x # 1 return inner foo = outer() foo.func_closure # doctest: +ELLIPSIS (<cell at 0x: int object at 0x>,) foo() 1 变量作用域:python的作用域规则下进行工作:“x是函数outer里的一个局部变量。当函数inner在#1处打印x的时候,python解释器会在inner内部查找相应的变量,当然会找不到,所以接着会到封闭作用域里面查找,并且会找到匹配。 变量生命周期:我们的变量x是函数outer的一个本地变量,这意味着只有当函数outer正在运行的时候才会存在。根据我们已知的python运行模式,我们没法在函数outer返回之后继续调用函数inner,在函数inner被调用的时候,变量x早已不复存在,可能会发生一个运行时错误。然而,它可以正常工作 闭包:Python支持一个叫做函数闭包的特性,嵌套定义在非全局作用域里面的函数能够记住它在被定义的时候它所处的封闭命名空间。这能够通过查看函数的func_closure属性得出结论,这个属性里面包含封闭作用域里面的值

装饰模式

匿名 (未验证) 提交于 2019-12-03 00:34:01
装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。下面给出装饰模式的UML图。 在这种设计中,手机的装饰功能被独立出来,可以单独发展,进而简化了具体手机类的设计。下面给出Phone类的实现: [cpp] view plain copy //公共抽象类 class Phone { public : Phone() {} virtual ~Phone() {} virtual void ShowDecorate() {} }; 具体的手机类的定义: [cpp] view plain copy //具体的手机类 class iPhone : public Phone { private : string m_name; //手机名称 public : iPhone(string name): m_name(name){} ~iPhone() {} void ShowDecorate() { cout<<m_name<< "的装饰" <<endl;} }; //具体的手机类

点读系列《流畅的python》

我只是一个虾纸丫 提交于 2019-12-03 00:13:41
第1章 python数据模型 python的写法是由背后的魔法方法实现的,比如obj[key],解释器实际调用的是obj.__getitem__(key) 作者把魔法方法叫做双下方法,因为有两个下划线 collections.namedtuple可以用来创建只有少数属性但没有方法的对象,比如 beer_card = Card('7', 'diamonds') random.choice和random.sample不一样的地方在于,sample是返回序列,choice是返回元素,当使用sample(list, 1)[0]的时候,不如直接使用choice(list) deck[12::13],是指先抽出索引是12的那张牌,然后每向后数13张牌拿一张 实现了__getitem__让对象变得可迭代了 sorted(deck, key=spades_high) python sorted函数 suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) def spades_high(card): rank_value = FrenchDeck.ranks.index(card.rank) return rank_value * len(suit_values) + suit_values[card.suit]

Django视图函数函数之视图装饰器

匿名 (未验证) 提交于 2019-12-02 23:49:02
FBV模式装饰器:   普通函数的装饰器(语法糖@)   views.py 1 from django.shortcuts import render 2 3 def wrapper(f): 4 def inner(*args,**kwargs): 5 print("before") 6 ret=f(*args,**kwargs) 7 print("after") 8 return ret 9 return inner 10 11 @wrapper 12 def index(request): 13 return render(request,"index.html") CBV模式装饰器:      在CBV模式视图函数中必须先导入: from django.views import View    (1)重写父类dispatch分发方法,在分发执行每个请求响应函数前后加上相应功能为实现类比装饰器     views.py 1 from django.shortcuts import render,HttpResponse 2 from django.views import View 3 from django.utils.decorators import method_decorator 4 5 class Myview(View): 6 7 def dispatch

装饰者模式

匿名 (未验证) 提交于 2019-12-02 23:43:01
一、概述 一般问题: 由于需求扩张需要对现有的对象添加新的功能。 核心方案: 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比继承更加灵活。 设计意图: 装饰者模式允许向一个现有的对象添加新的功能,同时又不改变其结构。其原理是将新增功能封装在装饰类中,其次,装饰类必然知道被装饰类,否则新增功能就无从谈起。实际上,装饰类就是被装饰类的一层包装。同代理模式非常相似,装饰类和被装饰类也需要实现同一个接口。 转载请标明出处: 装饰者模式 文章来源: 装饰者模式

spring 中常用的设计模式

匿名 (未验证) 提交于 2019-12-02 23:34:01
一、 Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模式: DispatcherServlet 策略模式: HandlerMapping 适配器模式: HandlerApdapter 模板方法模式: JdbcTemplate 观察者模式: ContextLoaderListener 二、Spring 的四大模块及典型的 设计模式   4、Spring JDBC 模板方法模式

Python学习之路26-函数装饰器和闭包

匿名 (未验证) 提交于 2019-12-02 22:54:36
《流畅的Python》笔记。 本篇将从最简单的装饰器开始,逐渐深入到闭包的概念,然后实现参数化装饰器,最后介绍标准库中常用的装饰器。 函数装饰器用于在源代码中“标记”函数,以某种方式增强函数的行为。装饰器就是函数,或者说是可调用对象,它以另一个函数为参数,最后返回一个函数,但这个返回的函数并不一定是原函数。 以下是装饰器最基本的用法: # 代码1 #装饰器用法 @decorate def target () : pass # 上述代码等价于以下代码 def target () : pass target = decorate ( target ) 即,最终的 target 函数是由 decorate(target) 返回的函数。下面这个例子说明了这一点: # 代码2 def deco ( func ) : def inner () : print ( "running inner()" ) return inner @deco def target () : print ( "running target()" ) target () print ( target ) # 结果 running inner () # 输出的是装饰器内部定义的函数的调用结果 < function deco .< locals >. inner at 0x000001AF32547D90 >

python装饰器之登录练习

匿名 (未验证) 提交于 2019-12-02 22:51:30
#__author: Administrator #date: 2018/5/21 login_status_jingdong = False login_status_weixin = False def start(): list={1:'home',2:'finance',3:'book'} list1={1:home,2:finance,3:book} for i in list: print(i,list[i]) select_num =input('请输入访问网页的编号[退出:q]>>') if select_num=='q': return exit() elif select_num.isdigit(): key=int(select_num) list1[key]() else: print('请输入有效值!') def login(auth_type=''): def outter(a): def inner(): global login_status_jingdong#获取全局变量来实现该变量的赋值修改 global login_status_weixin if auth_type=='jingdong': if login_status_jingdong is False: with open('京东账号', 'r', encoding='utf8')