装饰模式

装饰器模式(Decorator)

∥☆過路亽.° 提交于 2019-11-27 14:21:34
一、装饰模式介绍 装饰模式(decorator): 表示动态的给一个对象添加一些新的功能 (利用子类继承父类也可以实现),但是比生成子类方式更灵活。 也叫装饰者模式或者装饰器模式 例如:我们每个人身上穿的衣服,鞋子,领带,披风都可以理解为是对人的 装饰 。 装饰器模式类图: Component :定义一个对象接口,可以给这些对象动态添加职责。真实对象和装饰者对象有相同的接口,这样客户端不用知道内部有装饰者对象(Decorator) 存在的,还是以之前处理真实对象的相同方式来和装饰者对象交互。 ConcreteComponent :是定义了一个具体的对象(例如:人),也可以给这个对象添加一些其他职责。 Decorator :装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对Component来说,是无需知道Decorator存在的。 ConcreteDecorator :就是具体的装饰对象了(衣服,鞋子..),它起到了给Component添加职责的功能。 二、装饰模式代码实现 定义一个Component对象接口(ICar),汽车移动 1 2 3 4 5 6 /** * ICar表示Component: */ public interface ICar { void move(); //汽车移动 }

装饰器(Decorator)模式

孤者浪人 提交于 2019-11-27 14:20:38
1 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。动态是手段,组合才是目的。总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式。 2 问题提出:在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题? 这时我们就可以使用装饰器模式 同样的我们还是来举个例子看看: 设计一个小游戏 游戏中很多的角色(角色包括: 枪手Gunmen,刀客swordsman等), 角色拥有武器,武器包括(刀knife(150),枪gun(200),棍(100)), 游戏中我们可以通过给武器加上一些宝石(蓝宝石,红宝石,绿宝石) 来加强武器的攻击力。 红宝石每增加一颗 攻击力

装饰器模式(Decorator)

我的梦境 提交于 2019-11-27 14:19:54
一、装饰模式介绍 装饰模式(decorator): 表示动态的给一个对象添加一些新的功能 (利用子类继承父类也可以实现),但是比生成子类方式更灵活。 也叫装饰者模式或者装饰器模式 例如:我们每个人身上穿的衣服,鞋子,领带,披风都可以理解为是对人的 装饰 。 装饰器模式类图: Component :定义一个对象接口,可以给这些对象动态添加职责。真实对象和装饰者对象有相同的接口,这样客户端不用知道内部有装饰者对象(Decorator ) 存在的,还是以之前处理真实对象的相同方式来和装饰者对象交互。 ConcreteComponent :是定义了一个具体的对象(例如:人),也可以给这个对象添加一些其他职责。 Decorator :装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对Component来说,是无需知道Decorator存在的。 ConcreteDecorator :就是具体的装饰对象了(衣服,鞋子..),它起到了给Component添加职责的功能。 二、装饰模式代码实现 定义一个Component对象接口(ICar),汽车移动 1 2 3 4 5 6 /** * ICar表示Component: */ public interface ICar { void move(); //汽车移动 }

装饰器(Decorator)模式

痞子三分冷 提交于 2019-11-27 14:19:33
转自: http://miaoxiaodong78.blog.163.com/blog/static/18765136200701232434996/ Decorator 设计模式是典型的结构型模式(在 GOF 的那本模式的 Bible 中将模式分为: 1. 创建型模式; 2. 结构型模式; 3. 行为模式三种)。它的主要用意是: 动态地 为对象 添加 一些额外的 功能 。(记住上面两种颜色的词汇,理解装饰器模式的精髓所在!)下面是 GOF 的《 Element of reusable Object-Oriented Software 》中对 Decorator 用意的概述: Decorator Pattern ―― Attaches additional responsibilities to an object dynamically . Decorators provide a flexible alternative to subclassing for extending functionality . 1 何时需要使用装饰器模式 GOF 的那本 Bible 中关于装饰器模式列举的是一个文本组件与边框的例子(在这里我就不举了,主要是因为我会在书中举一个相似的,但却非常有说服力的例子,它对 Swing 中的某些本来应该使用 Decorator 却没有使用的对象的改进

php装饰者模式

一曲冷凌霜 提交于 2019-11-27 11:44:54
php装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 示例: A、B、C编辑同一篇文章。 class Article{ protected $content; public function __construct($info){ $this->content = $info; } } class editor_A extends Article{ public function __construct(Article $obj){ $this->content = $obj->content . '<br/>' . '编辑A新写的内容'; } public function decorator(){ return $this->content; } } class editor_B extends Article{ public function __construct(Article $obj){ $this->content = $obj->content . '<br/>' . '编辑B新写的内容'; } public function decorator(){ return $this->content; } } class editor_C extends Article{

laravel设计模式之装饰者模式

亡梦爱人 提交于 2019-11-27 11:44:36
装饰者模式是在开放 ---- 关闭原则下实现动态添加或减少功能的一种方式。 装饰者模式 就是不修改原类代码和继承的情况下动态扩展类的功能,传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需要加一个新的装饰器对象,更加灵活,避免数量和层次过多。 以laravel 为例子,在解析请求生成响应之前,或者之后需要经过中间件的处理,主要包括验证维护模式,cookie加密、开启回话,CSRF保护等,这些处理有些是在生成响应之前,有些是在生成响应之后,在实际开发过程中有可能还需要添加新的处理功能,如果在不修改原有类的基础上动态地添加或减少处理功能将使框架可扩展性大大增强,而这种需求正好被装饰者模式解决。 来源: https://www.cnblogs.com/quepq/p/9556724.html

GOF23设计模式-结构型(7种)

醉酒当歌 提交于 2019-11-27 10:51:28
文章目录 二、结构型模式 1. 外观模式(门面模式) 定义 适用场景 优点 缺点 源码 外观模式和中介者模式 外观模式和单例模式 外观模式和抽象工厂模式 2. 装饰者模式 定义 适用场景 优点 缺点 源码 装饰者模式和代理模式 装饰者和适配器模式 3. 适配器模式 定义 适用场景 优点 缺点 扩展 源码 适配器模式和外观模式 4. 享元模式 定义 适用场景 优点 缺点 内部状态和外部状态 源码 享元模式和代理模式 享元模式和单例模式 5. 组合模式 定义 适用场景 优点 缺点 源码 组合模式和访问者模式 6. 桥接模式 定义 适用场景 优点 缺点 源码 桥接和组合模式 桥接模式和适配器模式 7. 代理模式 定义 适用场景 优点 缺点 静态代理和动态代理 源码 源码链接:https://github.com/ouyangxizhu/design_pattern.git 二、结构型模式 1. 外观模式(门面模式) com.ouyangxizhu.design.pattern.structural.facade 定义 提供了一个结构来访问子系统中的一群接口。 这个外观结构 封装 了子系统之间的调用逻辑,调用顺序。比如购物,用户只关注我能不能买成功(下单功能),至于怎么减库存,怎么生成订单,怎么物流配送都不需要知道。 适用场景 当子系统越来越复杂,增加外观模式提供简单接口调用。

装饰者模式【java版】

Deadly 提交于 2019-11-27 10:36:48
一、基本结构 1.层次一:原始抽象类 抽象类:Cake abstract class Cake { protected String description="Unknown Cake"; public abstract void printDescription();//抽象方法必须指定为abstract类型 } 2.层次二:具体实现者、装饰者抽象类 具体实现者1:WhiteCake public class WhiteCake extends Cake { public WhiteCake() { description="WhiteCake"; } @Override public void printDescription() { System.out.println("制作最简单的蛋糕,蛋糕名为:"+description.toString()); }} 具体实现者2:YellowCake public class YellowCake extends Cake{ public YellowCake() { description="YellowCake"; } @Override public void printDescription() { System.out.println("制作最简单的蛋糕,蛋糕名为:"+description.toString()); }}

设计模式-装饰者模式

与世无争的帅哥 提交于 2019-11-27 10:27:40
定义 装饰者模式动态地将责任责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 实现要点 装饰器与被装饰的类需要继承自相同接口,来达到类型匹配。装饰器持有被装饰的类的实例。 代码实例 /** * 基础组件 */ abstract class Beverage { private String description = "Unknown Beverage"; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public abstract double cost(); } /** * 装饰器基类 */ abstract class Decorator extends Beverage { @Override public abstract String getDescription(); } /** * 被装饰的类 */ class Espresso extends Beverage { public Espresso() { setDescription("Espresso"); } @Override public double

----装饰器

只愿长相守 提交于 2019-11-27 07:35:45
1.装饰器作用   在 不改变函数调用方式 的基础上,在函数前后 添加功能 。    2.语法糖  位置放在被装饰函数上面 def timer(f):   #装饰器函数 def inner(): start = time.time() f() #被装饰的函数 end = time.time() print(end - start) return inner @timer #语法糖:@装饰器函数名 def func(): time.sleep(0.1) print('111') #语法糖的作用相当于在此处执行:func = timer(func),即把inner赋给func fun() 3.被装饰函数带返回值 def timer(f): def inner(): start = time.time() ret = f() #被装饰的函数 end = time.time() print(end - start) return ret return inner @timer #语法糖:@装饰器函数名 def func(): time.sleep(0.1) print('111') return ‘222’  #添加返回值 #语法糖的作用相当于在此处执行:func = timer(func) ret = fun() print(ret) 4被装饰函数带参数 在需要加入参数的位置全部加入参数