`

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中设计模式之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,...

    装饰器(Decorator)模式

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

    java Decorator装饰模式例子

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

    装饰器模式[Decorator]

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

    WPF 装饰器Decorator 和 Adorner综合实例

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

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

    23种Python设计模式示例演示源码包.rar

    23种Python设计模式示例演示源码包,比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享...

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

    4. **具体装饰器(Concrete Decorator)**:实现了装饰器接口,为组件增加新的行为或属性。每个具体装饰器都对应一种特定的扩展功能。 装饰模式的优点在于其灵活性,它可以独立于原始对象进行扩展,不需要修改原有...

Global site tag (gtag.js) - Google Analytics