`

Decorator装饰器

阅读更多

记得以前听一个高手说java.io包采用了了装饰器模式,当时不是很明白什么事装饰器模式,现在,网上看了一下说明和帮助的例子,他们的例子是这样的。

定义

Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。因此,装饰器模式具有如下的特征:

它必须具有一个装饰的对象。

它必须拥有与被装饰对象相同的接口。

它可以给被装饰对象添加额外的功能。

用一句话总结就是:保持接口,增强性能。

装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。

相同点:都拥有一个目标对象。

不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。

Sourcable类的源代码如程序12-22所示,其定义了一个接口函数 operation() 。

程序12-22 源接口Sourcable.java

package pattern.decorator; public interfaceSourcable { public void operation(); }

(2 ) Source.java 是 Sourcable.java的一个实现,其函数 operation()负责往控制台输出一个字符串:原始类的方法。其源代码如程序 12-23 所示。

程序12-23 源类Source.java

package pattern.decorator; public classSource implements Sourcable { public void operation() {System.out.println("原始类的方法"); } }

(3 )装饰器类 Decorator1.java采用了典型的对象适配器模式,它首先拥有一个 Sourcable 对象 source,该对象通过构造函 数进行初始化。然后它实现了 Sourcable.java 接口,以期保持与source同样的接口,并在重写的 operation() 函数中调用 source 的 operation()函数,在调用前后可以实现自己的输出,这就是装饰器所扩展的功能。其源代码如程序 12-24 所示。

程序12-24 装饰器类Decorator1.java

package pattern.decorator; public classDecorator1 implements Sourcable { private Sourcable sourcable; publicDecorator1(Sourcable sourcable){ super(); this.sourcable=sourcable; } publicvoid operation() { System.out.println("第一个装饰器前"); sourcable.operation(); System.out.println("第一个装饰器后"); } }

装饰器类Decorator2.java是另一个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序 12-25 所示。

程序12-25 装饰器类Decorator2.java

package pattern.decorator; public classDecorator2 implements Sourcable { private Sourcable sourcable; publicDecorator2(Sourcable sourcable){ super(); this.sourcable=sourcable; } publicvoid operation() { System.out.println("第二个装饰器前"); sourcable.operation(); System.out.println("第二个装饰器后"); } }

装饰器类Decorator1.java是第三个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序 12-26 所示。

程序12-26 装饰器类Decorator3.java

package pattern.decorator; public classDecorator3 implements Sourcable { private Sourcable sourcable; publicDecorator3(Sourcable sourcable){ super(); this.sourcable=sourcable; } publicvoid operation() { System.out.println("第三个装饰器前"); sourcable.operation(); System.out.println("第三个装饰器后"); } }

这时,我们就可以像使用对象的适配器模式一样来使用这些装饰器,使用不同的装饰器就可以达到不同的装饰效果。如程序12-27所示,首先需要创建一 个源类对象 source ,然后根据将对象使用 Decorator1 来装饰,并以此使用Decorator2 、Decorator3进行装饰,装饰后的对象 同样具有与 source 同样的接口。

程序12-27 测试类DecoratorTest.java

package pattern.decorator; public classDecoratorTest { /** * @param args */ public static void main(String[] args) {Sourcable source = new Source(); // 装饰类对象 Sourcable obj = new Decorator1(new Decorator2(newDecorator3(source))); obj.operation(); } }

运行该程序的输出如下:

第1 个装饰器装饰前

第2 个装饰器装饰前

第3 个装饰器装饰前

原始类的方法

第3 个装饰器装饰后

第2 个装饰器装饰后

第1 个装饰器装饰后

从输出的结果可以看出,原始类对象source 依次被 Decorator1 、 Decorator2 、 Decorator3 进行了装饰。

 

分享到:
评论

相关推荐

    jouryfirst#weekly-1#175.精读《设计模式 - Decorator 装饰器模式》1

    “就增加功能来说,Decorator 模式相比生成子类更为灵活” 这句话的含义是,组合比继承更灵活,当可拓展的功能很多时,继承方案会产生大量的子类,而组合可以提

    Python装饰器的定义与应用

    装饰器的使用示例中,首先定义了一个timer_decorator装饰器,其内部的wrapper函数记录了函数执行前后的开始时间和结束时间,并计算出时间差打印出来。这样,当装饰器应用于某个函数时,该函数执行时就会自动记录并...

    分析Python中设计模式之Decorator装饰器模式的要点

    在这个例子中,`log_decorator`装饰器会在调用`my_function`之前和之后打印一条消息,从而实现了日志记录功能。 在并发环境中,装饰器也可以用于实现线程同步。例如,我们可以创建一个装饰器`sync`,用于在调用方法...

    12步入门Python中的decorator装饰器使用方法

    装饰器在Python编程中扮演着重要的角色,它们允许开发者在不修改原有代码的基础上,增加或扩展函数的功能。本文将深入探讨12个步骤,帮助初学者掌握Python装饰器的使用方法。 1. **理解基本概念**: 装饰器本质上...

    timeout-decorator:Python的超时装饰器

    超时装饰器安装从源代码: python setup.py install从pypi: pip install timeout-decorator用法import timeimport timeout_decorator@timeout_decorator.timeout(5)def mytest(): print("Start") for i in range(1,...

    WPF 装饰器Decorator 和 Adorner综合实例

    在Windows Presentation Foundation (WPF) 中,装饰器(Decorator)和adorner是两种非常重要的UI元素,它们可以用于增强和扩展WPF控件的功能和视觉表现。本文将深入探讨这两种技术,并通过具体实例来阐述其在实际开发...

    装饰器(Decorator)模式

    装饰器(Decorator)模式 装饰器(Decorator)模式是一种典型的结构型模式,主要用意是动态地为对象添加一些额外的功能。它提供了一个灵活的替代方案来继承子类,以扩展对象的功能。 在《Element of Reusable ...

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式的特点 3. 装饰器模式的UML类图和基本结构 3.1 UML...

    java Decorator装饰模式例子

    `Decorator`是装饰器,持有`DecoratorComponent`的引用,并实现了相同的操作方法。`AdditionalFeatureA`和`AdditionalFeatureB`是具体装饰器,分别添加了功能A和功能B。 通过以下代码,我们可以创建一个装饰器链并...

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

    基于JavaScript装饰器Decorator实现的通信库

    JavaScript装饰器(Decorator)是一种元编程机制,它允许在运行时修改或增强对象的功能,而无需更改其源代码。在JavaScript中,装饰器是函数,它们可以被附加到类声明、方法、访问器、属性或参数上。装饰器提供了一种...

    Python 中的闭包、匿名函数、decorator 装饰器与python的偏函数

    这里,`log`是一个装饰器工厂函数,它接受一个`prefix`参数并返回一个新的装饰器`log_decorator`。`log_decorator`再接收一个函数并返回新的函数`wrapper`,实现了带有特定前缀的日志记录。 **完善装饰器** 为了...

    C#设计模式之Decorator 装饰模式

    4. 具体装饰器(Concrete Decorator):实现了装饰器的抽象方法,并添加新的行为或职责。 在"C#面向对象设计模式纵横谈(10):(结构型模式) Decorator 装饰模式.pdf"中,你可能会学习到如何定义这些角色以及它们之间...

    装饰器decorator_python_

    在`decorator.py`中,可能会包含更复杂的装饰器实现,比如带有参数的装饰器或者类装饰器。带参数的装饰器允许我们在应用装饰器时传入一些配置,以适应不同场景的需求。类装饰器则通过定义一个类来实现,这种方式更加...

    empdemo:emp vue2 demo 使用vue-property-decorator装饰器,可ts开发

    在"empdemo"这个项目中,我们看到它使用的是Vue2,而且特别提到了`vue-property-decorator`,这是一个用于在Vue2中结合TypeScript进行开发的装饰器库。 **Vue2与TypeScript的结合** Vue2本身支持使用JavaScript...

    Decorator装饰者模式

    在装饰者模式中,我们通常有两个主要的角色:Component(组件)和Decorator(装饰器)。Component是被装饰的对象接口,定义了所有装饰器和原始对象共同拥有的行为。Concrete Component是Component的具体实现,是实际...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

Global site tag (gtag.js) - Google Analytics