装饰模式

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

限于喜欢 提交于 2019-12-04 12:15:54
装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 与代理模式区别:代理模式一般是自己内部创建被代理的对象,不需要构造函数时传入对象参数。 装饰(Decorator)模式的主要优点有: 采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。 其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。 装饰模式的结构与实现 通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。下面来分析其基本结构和实现方法。 1. 模式的结构 装饰模式主要包含以下角色。 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。 具体装饰(ConcreteDecorator)角色

装饰器函数02

♀尐吖头ヾ 提交于 2019-12-04 09:10:58
1 #装饰器 2 #1.简单的装饰器 3 #2.有返回值的装饰器 4 #3.被装饰函数带参数的装饰器 5 #4.被装饰函数带有多个不同个数参数的装饰器 6 #5.装饰器函数带参数 7 #6.多个装饰器装饰同一个函数 8 #装饰器的作用 9 #不修改函数调用方式 但是在原来的函数前后添加功能 10 #原则:开放封闭原则 11 #开放:对扩展是开放的 12 #封闭:对修改是封闭 13 #装饰器的固定模式 14 15 #****************************************************************************** 16 import time 17 18 def timmer(f): 19 start = time.time() 20 f() 21 end = time.time() 22 print(end - start) 23 24 def func(): 25 time.sleep(0.01) 26 print('大家好') 27 28 timmer(func) 29 30 #****************************************************************************** 31 def func(): 32 time.sleep(0.01) 33 print(

11.设计模式之九:装饰模式【结构型模式】

ぃ、小莉子 提交于 2019-12-04 06:45:58
定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 装饰(Decorator)模式的主要优点有: 采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。 其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。 结构与实现 通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。 如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。 下面来分析其基本结构和实现方法: 1. 模式的结构 装饰模式主要包含以下角色。 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。 2. 模式的实现 装饰模式的实现代码如下:

初学设计模式之装饰者模式

﹥>﹥吖頭↗ 提交于 2019-12-04 02:30:35
装饰者模式的代码例子 1 #include<iostream> 2 using namespace std; 3 class SelfAbstract 4 { 5 public: 6 virtual void exec(){}; 7 }; 8 9 class Self:public SelfAbstract 10 { 11 public: 12 void exec() 13 { 14 cout<<"被装饰的本体"<<endl; 15 }; 16 }; 17 18 class Decrator:public SelfAbstract 19 { 20 private: 21 SelfAbstract *m_selfAbstract; 22 public: 23 Decrator(SelfAbstract *selfAbstract) 24 { 25 m_selfAbstract=selfAbstract; 26 }; 27 void exec() 28 { 29 m_selfAbstract->exec(); 30 }; 31 }; 32 33 class Decrator1:public SelfAbstract 34 { 35 private: 36 SelfAbstract *m_selfAbstract; 37 public: 38 Decrator1(SelfAbstract

设计模式——个人理解

懵懂的女人 提交于 2019-12-03 21:15:22
写在前面 设计模式是基于固定设计场景的一套解决方案,目的是为了完成开闭原则,或者说面向后续的需求变更,以成本最低的改动和测试完成新功能。同时设计模式也是一种程序员之间的交流语言,可以省去很多沟通成本。 在工作的过程中,从最初不知如何使用设计模式,到中间刻意使用设计模式,到今天稍有好转的正确的使用设计模式,踩了许多坑,也有过度设计的时候,为了避免今后在犯同样的错误,所以准备将自己在项目实践的过程中使用过的设计模式记录下来。 设计模式中,有一些实战里用过,有的没用过,没用过的应该是对这个设计方法没有领悟透彻,所以不知道该怎么用。 目前先按照自己的理解记录下来,有更深的领悟会更新。 创建型设计模式 1、工厂方法模式(FactoryMethod) 工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。” 工厂方法模式,是在抽象类中定义创建对象的方法,调用声明创建过程(抽象方法,但创建对象的过程的实现是在实现类中定义。 也就是说,在创建对象时,创建步骤是固定的,但各个步骤的实现是多种多样的,这种情况下可以使用工厂方法。 例如:创建一个电脑主机,需要安装CPU,内存,硬盘,显卡。这个安装步骤是固定的,但是由不同的工厂实现类去实现这几个步骤。 这种父类声明,子类实现的方式有很多,把这种方法用于创建对象,就叫工厂方法

装饰器模式

拜拜、爱过 提交于 2019-12-03 13:24:41
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 主要解决: 一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。 何时使用: 在不想增加很多子类的情况下扩展类。 如何解决: 将具体功能职责划分,同时继承装饰者模式。 关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。 应用实例: 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。 优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式

设计模式之简单理解装饰器模式与运用

谁都会走 提交于 2019-12-03 10:04:22
1.什么是装饰器模式 ​ 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 ​ 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 2、装饰器模式的重要组成部分 ①装饰器模式特点: (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。 (2) 装饰对象包含一个真实对象的引用(reference) (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。 (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。 ②装饰器模式由组件和装饰者组成: 抽象组件(Component):需要装饰的抽象对象。 具体组件(ConcreteComponent):是我们需要装饰的对象。 抽象装饰类(Decorator):内含指向抽象组件的引用及装饰者共有的方法。 具体装饰类(ConcreteDecorator):被装饰的对象。 3.装饰器模式的具体实现 生活中的装饰器小例子: ​ 公路上的汽车川流不息,我们的生活总是繁忙不停。终于有了一个假期

设计模式 装饰器模式

空扰寡人 提交于 2019-12-03 09:21:52
装饰器模式:为对象添加新功能,不改变其原有的结构和功能 适配器模式是原有的不能用了,要重新封装接口。装饰器模式是原有的还能用,但是需要新增一些东西来完善这个功能 比如手机壳,手机本身的功能不受影响,手机壳就是手机的装饰器模式 uml类图 代码 class Circle { draw() { console.log('画一个圆形'); } } class Decorator { constructor(circle) { this.circle = circle; } draw() { this.circle.draw(); this.setRedBorder(circle); } setRedBorder(circle) { console.log('设置红色边框') } } // 测试 let circle = new Circle(); let client = new Decorator(circle); client.draw(); 使用场景 ES7装饰器 1、安装 yarn add babel-plugin-transform-decorators-legacy 2、.babelrc { "presets": ["es2015", "latest"], "plugins": ["transform-decorators-legacy"] } 3、代码 //

装饰器,生成器,推倒式

岁酱吖の 提交于 2019-12-03 07:46:58
装饰器:   在不改变对象结构的情况下,向其添加新功能,是一种结构型的设计模式。本质上是一个高级Python函数,通过给别的函数添加@标识的形式实现对函数的装饰。   装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。 staticmethod:无self参数,外部可直接访问 classmethod:类方法,第一个参数为cls,可通过类名来访问 property:属性,函数当做属性访问 生成器:函数中含有yield关键字。生成器是一个迭代器,在调用生成器执行的过程中,每次遇到yield关键字时,函数会暂停并保存当前所有运行信息,返回yield的值,并在下一次执行next()方法时,从当前位置继续运行。 推导式:   列表推导式 [n for n in mylist if n > 0]   生成器表达式 (n for n in mylist if n > 0)   字典推导式 {key: value for key, value in mydict.items() if value > 200}   集合推导式 {key for key in myset if key != 0} 来源: https://www

JavaScript 装饰器极速指南

*爱你&永不变心* 提交于 2019-12-03 06:24:11
本文转载于: 猿2048 网站➝ https://www.mk2048.com/blog/blog.php?id=hj1jk2cb0j Decorators 是ES7中添加的JavaScript新特性。熟悉Typescript的同学应该更早的接触到这个特性,TypeScript早些时候已经支持Decorators的使用,而且提供了ES5的支持。本文会对Decorators做详细的讲解,相信你会体验到它给编程带来便利和优雅。 我在专职做前端开发之前, 是一名专业的.NET程序员,对.NET中的“特性”使用非常熟悉。在类、方法或者属性上写上一个中括号,中括号里面初始化一个特性,就会对类,方法或者属性的行为产生影响。这在AOP编程,以及ORM框架中特别有用,就像魔法一样。 但是当时JavaScript并没有这样的特性。在TypeScript中第一次使用Decorators,是因为我们要对整个应用程序的上下文信息做序列化处理,需要一种简单的方法,在原来的领域模型上打上一个标签来标识是否会序列化或者序列化的行为控制,这种场景下Decorators发挥了它的威力。 后来我们需要重构我们的状态管理,在可变的类定义和不可变对象的应用间进行转换,如果使用Decorators,不论从编的便利性还是解耦的角度都产生了令人惊喜的效果。 一直想把Decorators的相关使用整理出一个通俗的文档