装饰模式

闭包和装饰器

ぃ、小莉子 提交于 2020-02-10 17:45:12
闭包 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值时,相关参数和变量保存在返回的函数中,这种结果叫闭包。 # 闭包结构,myF5用到了myF4的参数args def myF4 ( * args ) : def myF5 ( ) : rst = 0 for n in args : rst += n return rst return myF5 # 常见的闭包错误 def count ( ) : # 定义列表,列表里存放的是定义的函数 fs = [ ] for i in range ( 1 , 4 ) : # 定义了一个函数f # f是一个闭包结构 def f ( ) : return i * i fs . append ( f ) return fs f1 , f2 , f3 = count ( ) print ( f1 ( ) ) print ( f2 ( ) ) print ( f3 ( ) ) # 此时的输出会是9,9,9,并不是我们想要的1,4,9 造成上述状况的原因是,返回函数引用变量i,i并非立即执行,而是等到三个函数都返回的时候才统一使用,此时i已经变成了3,最终调用的时候,都是返回3*3 此问题描述成: 返回闭包时,返回函数不能引用任何循环变量 解决方案: 用函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变

python语法基础-函数-装饰器-长期维护

白昼怎懂夜的黑 提交于 2020-02-10 07:20:14
############### 装饰器的初成和开放封闭原则 ############## # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 # # 需求:计算程序执行的时间, import time def func(): start = time.time() time.sleep(0.01) print(123) end = time.time() print(end-start) func() # 这种写法如果有100个函数,你都要加一遍这是不行的,太麻烦了, # 第二版 def func(): time.sleep(0.01) print(123) def timer(f): start = time.time() f() end = time.time() print(end-start) timer(func) # 专门写了一个函数用来计算函数的执行时间, # 闭包的写法 def func(): time.sleep(0.01) print(123) def timer(f): def inner(): start = time.time() f() end = time.time() print(end-start) return inner # 这就是一个闭包,因为是函数的嵌套,并且函数内部调用函数外部的参数, #

java设计模式-装饰者模式

百般思念 提交于 2020-02-09 05:27:05
这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。 要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 以点咖啡为例: 我们在点咖啡的时候通常会有这样的情况: 点了不同的咖啡会有不同的价格,此时我们需要一个咖啡的基类,不同的咖啡重写基类的cost()方法来实现自己的价格,但有时候我们点咖啡的时候会需要添加一些额外的调料,这个时候价格就变了,而这些额外的调料现在又是不确定的,如果提供过多的set()和get()方法来进行调料的添加又会出现新的问题,如果后续推出茶,汽水之类的饮料时,我们从基类那里继承过来很多没用的set和get方法 所以在这里我们采用不一样的做法:以饮料为主体,然后在运行时以调料来“装饰”饮料,比如说顾客想要 加摩卡和加奶泡的深培咖啡,那么,要做的是: 1:拿一个深培咖啡对象(DarkRoast) 2:以摩卡(Mocha)对象装饰它 3:以奶泡(Whip)对象装饰它 4:调用cost()方法,并依赖委托

装饰者模式

跟風遠走 提交于 2020-02-09 05:13:08
装饰者模式定义: 装饰者模式动态的将责任附加到对象上,若要扩展对象,装饰者模式提供了比继承更有弹性的替代方案。 装饰者模式类图: 说明: a) ConcreteComponent是我们要动态地加上新行为的对象,它扩展自Component; b) 每个组件都可以单独使用,或者被装饰者包装起来使用; c) 每个装饰者都“有一个”(包装一个)组件,也就是说,装饰者有一个实例变量以保存某个Component的引用; d) Decorator是装饰者共同实现的接口(也可以是抽象类); e) ConcreteDecorator有一个实例变量,可以记录所装饰的事物(装饰者包装的Component); f) 装饰者可以加上新的方法,新行为是通过在旧行为前面或后面做一些计算来添加的。 装饰者模式具体示例: 在购买咖啡时,可以在咖啡中加入各种调料,例如:蒸奶(Steamed Milk)、豆浆(Soy)、摩卡(Mocha)或覆盖奶泡。 咖啡店会根据所加入的调料收取不同的费用,所以咖啡店订单系统必须考虑到这些调料部分。 现在考虑用装饰者模式来完成这个订单系统,以实现饮料结算和描述接口。下图是采用装饰者模式的咖啡订单系统类图: 说明: HouseBlend、DarkRoast、Espresso和Decaf是四个具体的组件,每一个组件代表一种咖啡类型; Milk、Mocha

c++设计模式:装饰者模式(Decorator Pattern)

点点圈 提交于 2020-02-09 00:27:33
定义: 装饰者模式动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 场景: 我们购买咖啡的时候,可以要求在其中加入各种调料,例如:蒸奶、豆浆、摩卡或覆盖奶泡,而咖啡店也会根据所加入的调料收取不同的费用,所以当我们设计订单系统的时候就需要考虑到这些调料部分啦。顾客的需求不一,如果我们针对每种配方都声明一个类得话,系统的维护将会十分头疼。此时装饰者模式就派上用场啦。我们可以根据顾客的需要动态的扩展顾客定制的咖啡,让其加上不同的调料,最终计算出顾客所需缴纳的费用。它的实现有点类似于递归,在实际使用的时候可以慢慢体会。 类图: c++代码如下: 不使用指针版本: #include <iostream>#include <string>using namespace std;class Beverage{public: virtual ~Beverage() {}; virtual string getDescription(); // 必须是虚函数,否则会造成后期使用时描述显示不正确 virtual double cost() = 0;protected: string m_description;};class CondimentDecorator:public Beverage{public: virtual string getDescription()

7 装饰者模式

♀尐吖头ヾ 提交于 2020-02-09 00:12:39
装饰者模式 一、应用实例 咖啡订单项目 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack、Decaf 2)调料:Milk、Soy、Chocolate 3)要求在扩展新的咖啡种类时,有良好的扩展性、改动方便。 二、装饰者模式 动态的将新功能附加到对象上。在对象功能扩展方面比继承更有弹性 1.装饰者模式解决咖啡订单项目 2.装饰者模式下的订单:2份巧克力里和一份牛奶的LongBlack 3.代码实现 public class CoffeeBar { public static void main(String[] args) { // 装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack // 1. 点一份 LongBlack Drink order = new LongBlack(); System.out.println("费用1=" + order.cost()); System.out.println("描述=" + order.getDes()); // 2. order 加入一份牛奶 order = new Milk(order); System.out.println("order 加入一份牛奶 费用 =" + order.cost()); System.out.println("order 加入一份牛奶 描述

设计模式常见面试题汇总

北战南征 提交于 2020-02-07 14:07:54
设计模式常见面试题汇总 1.说一下设计模式?你都知道哪些? 答:设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )。 **分类** **包含** **关注点** 创建型模式 工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式 关注于对象的创建,同时隐藏创建逻辑 结构型模式 适配器模式、过滤器模式、装饰模式、享元模式、代理模式、外观模式、组合模式、桥接模式 关注类和对象之间的组合 行为型模式 责任链模式、命令模式、中介者模式、观察者模式、状态模式、策略模式、模板模式、空对象模式、备忘录模式、迭代器模式、解释器模式、访问者模式 关注对象之间的通信 下面会对常用的设计模式分别做详细的说明。 2.什么是单例模式? 答:单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。 优点:不会频繁地创建和销毁对象,浪费系统资源。 使用场景:IO 、数据库连接、Redis 连接等。 单例模式代码实现: class Singleton { private static Singleton instance = new Singleton(); public

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

别等时光非礼了梦想. 提交于 2020-02-07 05:29:53
装饰器模式能够在不改 变对象自身的基础上,在程序运行期间给对象 动态地添加职责。遵循开闭原则(应该对于扩展是开放的,对修改是关闭的,即实体应当通过扩展实现变化,而不是修改代码实现变化),利用继承和组合的方式解耦对象间的关系。 例子 以常见的案列咖啡为例。在不考虑设计模式的时候,按照传统的思路,我们会写一个父类表示纯咖啡,如果不能满足需要,就在添加一个加牛奶的咖啡的类去继承咖啡父类,如果还想要加糖,那么在创建一个加糖的类继承父类,这样虽然解决了问题,但是子类膨胀,不利于管理。 以装饰器模式进行开发的话,需要先定一个顶层的接口,对咖啡的行为进行规范 public interface Coffee { String getName(); double getPrice(); } 由于咖啡中需要加各种材料,独把它抽象出来,将其设计成一个抽象类,让子类去添加材料。 public abstract class CoffeeAbstractor implements Coffee { private Coffee coffee; public CoffeeAbstractor(Coffee coffee) { this.coffee = coffee; } @Override public String getName() { return coffee.getName(); }

初涉装饰器模式

℡╲_俬逩灬. 提交于 2020-02-06 05:28:18
\quad 装饰器模式是GOF23种设计模式中较为常用的一种模式。它可以实现对原有类的包装和装饰,使新的类具有更强的功能。 \quad 我这里有饮料咖啡, 我们可以通过加入牛奶或蔗糖,实现原有饮料口味的扩展和价格的变化。这就是一种“装饰器模式”。 我们在未来给普通人加装“外骨骼”装饰,让普通人具有力扛千斤的能力,也是一种“装饰器模式”。 装饰器模式演示 /** * 模拟咖啡 * 1、抽象组件:需要装饰的抽象对象(接口或抽象父类) * 2、具体组件:需要装饰的对象 * 3、抽象装饰类:包含了对抽象组件的引用以及装饰者共有的方法 * 4、具体装饰类:装饰的对象 * @author 影随风 */ public class DecorateTest02 { public static void main ( String [ ] args ) { Drink coffee = new Coffee ( ) ; Drink suger = new Suger ( coffee ) ; //装饰 System . out . println ( suger . info ( ) + "-->" + suger . cost ( ) ) ; Drink milk = new Milk ( coffee ) ; //装饰 System . out . println ( milk . info (

装饰者模式

旧时模样 提交于 2020-02-05 04:17:06
装饰者模式 对原有功能进行增强。装饰模式含有一下几部分。抽象构件、具体构件、抽象装饰、具体装饰。原本功能是具体构件中的功能,现在要通过装饰来对具体构建进行增强。 1. 抽象构件 定义一个接口,来确定他的子类要实现怎样的功能。 package com.wx.demo01; //抽象构建角色 public interface Component { public void operation(); } 2. 具体构件 定义具体构件类,实现抽象构件接口,此类就是原本的功能。 package com.wx.demo01; //具体构建角色 public class ConcreteComponent implements Component{ public void operation() { System.out.println("调用具体构件角色的方法operation()"); } public ConcreteComponent(){ System.out.println("创建具体构建角色"); } } 3.抽象装饰 现在需要对原本功能进行装饰增强。定义抽象装饰类,实现抽象构件接口。 package com.wx.demo01; //抽象装饰角色 public class Decorator implements Component{ private Component