今天学员在学习java的时候提到了Decorator其设计模式,在网找到了这样一个案例,还不错,给学员分享一下!
Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。因此,装饰器模式具有如下的特征:
它必须具有一个装饰的对象。
它必须拥有与被装饰对象相同的接口。
它可以给被装饰对象添加额外的功能。
用一句话总结就是:保持接口,增强性能。
装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。
相同点:都拥有一个目标对象。
不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。
Sourcable类的源代码如程序 12-22 所示,其定义了一个接口函数 operation() 。
程序12-22 源接口 Sourcable.java
Java代码
1.package pattern.decorator;
2.
3.public interface Sourcable {
4. public void operation();
5.
6.}
package pattern.decorator;
public interface Sourcable {
public void operation();
}
(2 ) Source.java 是 Sourcable.java 的一个实现,其函数 operation() 负责往控制台输出一个字符串:原始类的方法。其源代码如程序 12-23 所示。
程序12-23 源类 Source.java
Java代码
1.package pattern.decorator;
2.
3.public class Source implements Sourcable {
4.
5. public void operation() {
6. System.out.println("原始类的方法");
7. }
8.
9.}
package pattern.decorator;
public class Source 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
Java代码
1.package pattern.decorator;
2.
3.public class Decorator1 implements Sourcable {
4.
5. private Sourcable sourcable;
6. public Decorator1(Sourcable sourcable){
7. super();
8. this.sourcable=sourcable;
9. }
10.
11. public void operation() {
12. System.out.println("第一个装饰器前");
13. sourcable.operation();
14. System.out.println("第一个装饰器后");
15.
16. }
17.
18.}
package pattern.decorator;
public class Decorator1 implements Sourcable {
private Sourcable sourcable;
public Decorator1(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第一个装饰器前");
sourcable.operation();
System.out.println("第一个装饰器后");
}
}
装饰器类Decorator2.java 是另一个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序 12-25 所示。
程序12-25 装饰器类 Decorator2.java
Java代码
1.package pattern.decorator;
2.
3.public class Decorator2 implements Sourcable {
4.
5. private Sourcable sourcable;
6. public Decorator2(Sourcable sourcable){
7. super();
8. this.sourcable=sourcable;
9. }
10. public void operation() {
11. System.out.println("第二个装饰器前");
12. sourcable.operation();
13. System.out.println("第二个装饰器后");
14.
15. }
16.
17.}
package pattern.decorator;
public class Decorator2 implements Sourcable {
private Sourcable sourcable;
public Decorator2(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第二个装饰器前");
sourcable.operation();
System.out.println("第二个装饰器后");
}
}
装饰器类Decorator1.java 是第三个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序 12-26 所示。
程序12-26 装饰器类 Decorator3.java
Java代码
1.package pattern.decorator;
2.
3.public class Decorator3 implements Sourcable {
4.
5. private Sourcable sourcable;
6. public Decorator3(Sourcable sourcable){
7. super();
8. this.sourcable=sourcable;
9. }
10. public void operation() {
11. System.out.println("第三个装饰器前");
12. sourcable.operation();
13. System.out.println("第三个装饰器后");
14.
15. }
16.
17.}
package pattern.decorator;
public class Decorator3 implements Sourcable {
private Sourcable sourcable;
public Decorator3(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第三个装饰器前");
sourcable.operation();
System.out.println("第三个装饰器后");
}
}
这时,我们就可以像使用对象的适配器模式一样来使用这些装饰器,使用不同的装饰器就可以达到不同的装饰效果。如程序12-27 所示,首先需要创建一 个源类对象 source ,然后根据将对象使用 Decorator1 来装饰,并以此使用 Decorator2 、 Decorator3 进行装饰,装饰后的对象 同样具有与 source 同样的接口。
程序12-27 测试类 DecoratorTest.java
Java代码
1.package pattern.decorator;
2.
3.public class DecoratorTest {
4.
5. /**
6. * @param args
7. */
8. public static void main(String[] args) {
9. Sourcable source = new Source();
10.
11. // 装饰类对象
12. Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));
13. obj.operation();
14. }
15.
16.}
package pattern.decorator;
public class DecoratorTest {
/**
* @param args
*/
public static void main(String[] args) {
Sourcable source = new Source();
// 装饰类对象
Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));
obj.operation();
}
}
运行该程序的输出如下:
第1 个装饰器装饰前
第2 个装饰器装饰前
第3 个装饰器装饰前
原始类的方法
第3 个装饰器装饰后
第2 个装饰器装饰后
第1 个装饰器装饰后
从输出的结果可以看出,原始类对象source 依次被 Decorator1 、 Decorator2 、 Decorator3 进行了装饰
分享到:
相关推荐
在这个名为"JAVA design pattern-java设计模式"的CHM文件中,我们可能找到了关于如何在Java开发中应用设计模式的详细信息。 设计模式通常分为三大类:创建型、结构型和行为型。创建型模式关注对象的创建,如单例...
《转帖经典---JAVA设计模式》这本书或资料可能涵盖了这些模式的详细解释、示例代码以及如何在实际项目中应用这些模式。通过学习和理解这些设计模式,开发者能够更好地设计和重构软件,提升代码质量。
Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结。Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而...
在这个"计算机后端-Java-图解java设计模式代码.zip"压缩包中,我们很可能会找到各种Java设计模式的实例代码,这对于学习和理解设计模式非常有帮助。 首先,让我们来详细了解一下Java设计模式的一些主要类别: 1. *...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和标准解决方案。设计模式并不直接提供代码实现,而是提供了一种通用的语言,让开发者能够更好地理解和交流复杂的系统架构。这些...
《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...
设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之...
在这个“软件体系结构---设计模式的Java运行代码案例”中,我们将深入探讨如何在Java编程环境中应用这些模式。 首先,我们要理解什么是设计模式。设计模式不是具体的代码或库,而是一种描述在特定上下文中如何解决...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
装饰者模式是软件设计模式中的一种结构型模式,它...综上所述,装饰者模式在Java编程中是一种重要的设计模式,尤其适用于需要动态添加或删除对象功能的场景。通过以上示例和解释,我们可以更好地理解和应用装饰者模式。
装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...
【Decorator模式】是一种设计模式,它允许在运行时动态地给对象添加新的责任或功能,而不必通过子类化的方式。在上述的奇幻RPG游戏中,Decorator模式被用来实现武器的锻造过程,尤其是武器镶嵌宝石的功能。这个过程...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。在Java领域,23种设计模式被广泛接受,它们分为三大类:创建型、结构型和行为型。下面,...
"设计模式总结-java与模式清晰版"这个标题表明我们即将探讨的是关于Java编程语言中的设计模式,旨在帮助开发者更好地理解和应用这些模式。这篇博文链接(https://410063005.iteye.com/blog/1680031)可能提供了详细...
Java设计模式中的Builder模式和Decorator模式是两种重要的设计模式,它们在软件开发中起到优化代码结构、提高代码复用性和灵活性的作用。 1. 建造者模式(Builder) 建造者模式是一种创建型设计模式,它的主要目的...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...