装饰对象Decorator

装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

目标是允许类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。这样的设计具有弹性可以应对改变,可以接受新的功能来对应改变的需求。

摩卡奶泡深焙咖啡:一杯深焙咖啡,摩卡装饰它,奶泡装饰它,cost()+delegate调料价格。

把装饰者当成“包装者”。

  • 装饰者和被装饰者对象有相同的超类型。
  • 可以用一个或多个装饰者包装一个对象。
  • 既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
  • 装饰者可以在所委托被装饰者的行为之前在/或之后,加上自己的行为,以达到特定的目的。
  • 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

1.类应该对扩展开放,对修改关闭。

2.

咖啡饮料

CondimentDecorator扩展自Beverage类,重点在于装饰者和被装饰者必须是一样的类型,利用继承达到“类型匹配”,而不是利用继承获得“行为”,装饰者需要和被装饰者(被包装的组建)有相同的“接口”,因为装饰者必须能取代被装饰者。

当将装饰者和组件组合时,就是在加入新的行为,并不是继承自超类,而是由组合对象的来的。因为使用对象组合,可以把所有饮料和调料更有弹性地加以混合和匹配。如果依赖继承,那么类的行为只能在编译时静态决定。行为如果不是来自超累,就是子类覆盖后的版本。反之利用组合,可以吧装饰者混合使用,而且是在“运行时”。我们可以在任何时候,实现新的装饰者增加新的行为。如果依赖继承,每当需要新行为时,还得修改现有的代码。

时间: 2024-10-19 08:58:55

装饰对象Decorator的相关文章

Android与设计模式——装饰者(Decorator)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展.(上文来源于网络) 装饰模式的类图如下: 在装饰模式中的角色有: ● 抽象构件(Context)角色:给

设计模式之装饰(Decorator)模式

(一)什么是装饰(Decorator)模式 装饰模式,又称为包装模式,它以对客户端透明的方式扩张对象的功能,是继承关系的替代方案之一. 装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展. (二)装饰模式的角色 1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接受附加责任的对象 2)具体构件(Concrete component)角色:定义一个将要接受附加责任的类 3)装饰角色(Decorator)角色:持有一个构建(Component)对象的实例 4)具体装饰(

装饰设计模式 Decorator

package lesson06; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; public class Demo01 { public static void main(String[] args) { //

对Python中装饰器(Decorator)的理解与进阶

有时候我们项目中的某些功能做些修改即需要对内部的某些函数添加一些附加功能,但是为了安全起见不想改变函数的源代码以及函数的调用方式,那么装饰器在这个地方会给我们带来很大的帮助. 装饰器(Decorator):(又叫语法糖) 定义:本质是函数,功能(装饰其它函数)就是为其他函数添加附加功能 原则:(1).不能修改被装饰的函数的源代码 (2).不能修改被装饰的函数的调用方式 1.先来实现一个简单的装饰器示例: #!/usr/bin/env python # -*- coding:utf-8 -*- #

Java 实现装饰者(Decorator)模式

在Java中,io包下的很多类就是典型的装饰者模式的体现,如: new BufferedOutputStream(OutputStream out) new BufferedInputStream(InputStream in); new PrintWriter(OutputStream out) new FilterReader(Reader in); 装饰类与被装饰的类 实现相同的接口, 被装饰类,不关心具体是哪个实现类来装饰它, 同样的业务方法,被装饰类调用装饰类的方法,增强装饰类的功能

python装饰器(decorator)

最近在自学Python,在装饰器这里迷惑了我很久,有几个问题一直困惑着我.1.装饰器的语法原理:2.为什么要用装饰器: 首先来看一下装饰器的原理.总而言之,装饰器就是函数或者类作为函数的返回值.将函数或者类作为装饰器的参数传递之后,装饰器对该函数或者类进行相应操作后再将其返回.这就是装饰器的基本原理.举个例子来讲,我们定义装饰器decorator,定义函数f.其过程便如下:f=decorator(f).这里显得很抽象,我们用具体的例子来描述一下其意思.这里我们定义了一个函数: 1 def rec

请设计一个有参装饰器decorator,它可作用于任何函数上

最近有小伙伴面试,遇到一个很有意思的题:请设计一个有参装饰器decorator,它可作用于任何函数上,要求可以接受一个int作为参数,该参数为要求的执行秒数,如果该函数的执行时间大于规定的执行秒数,请打印改函数名字和执行时间. 这个题我之前面试的也遇到过,当时用高阶函数的方式实现,现在又遇到了,废话少说,咱们开发. 先来分析下: 1 有参数的装饰器 --> 高阶函数 2 执行时间 --> time 库 上代码: from functools import wraps import time #

ES6装饰器Decorator基本用法

1. 基本形式 @decorator class A {} // 等同于 class A {} A = decorator(A); 装饰器在javascript中仅仅可以修饰类和属性,不能修饰函数.装饰器对类的行为的改变,是代表编译时发生的,而不是在运行时.装饰器能在编译阶段运行代码.装饰器是经典的AOP模式的一种实现方式. 2. 装饰器的执行顺序 同一处的多个装饰器是按照洋葱模型,由外到内进入,再由内到外执行 function dec(id){ console.log('evaluated',

关于Python的装饰器 decorator

语法格式是固定的:先定义一个函数,再使用@语法调用该函数. 例子一: import functools # 定义装饰器,固定格式 def log(func): @functools.wraps(func) # 将func的一些属性赋予wrapper,如__name__ def wrapper(*args, **kw): print('before function %s' % func.__name__) func(*args, **kw) print('after function %s' %