装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰模式的特点:
1) 装饰对象和真实对象有相同的接口,这样客户端对象就可以和真实对象相同的方式和装饰对象交互。
2)装饰对象包含一个真实对象的引用。
3)装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。
4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
类图:
实例:
public abstract class Drink
{
protected String desc;
public String getDesc()
{
return this.desc;
}
public abstract float cost();
}
public class Espresso extends Drink
{
public Espresso()
{
this.desc = "in Espresso,";
}
@Override
public float cost()
{
return 100;
}
}
public class DartRoast extends Drink
{
public DartRoast()
{
this.desc = "in DartRoast,";
}
@Override
public float cost()
{
return 50;
}
}
public abstract class Decorator extends Drink
{
protected final Drink drink;
public Decorator(final Drink drink)
{
this.drink = drink;
}
@Override
public abstract float cost();
}
public class Mocha extends Decorator
{
public Mocha(final Drink drink)
{
super(drink);
this.desc = " add Mocha ";
}
@Override
public String getDesc()
{
return this.drink.getDesc() + this.desc;
}
@Override
public float cost()
{
return this.drink.cost() + 10;
}
}
public class Soy extends Decorator
{
public Soy(final Drink drink)
{
super(drink);
this.desc = " add Soy ";
}
@Override
public String getDesc()
{
return this.drink.getDesc() + this.desc;
}
@Override
public float cost()
{
return this.drink.cost() + 5;
}
}
public class Whip extends Decorator
{
public Whip(final Drink drink)
{
super(drink);
this.desc = " add Whip ";
}
@Override
public String getDesc()
{
return this.drink.getDesc() + this.desc;
}
@Override
public float cost()
{
return this.drink.cost() + 15;
}
}
public class Client
{
public static void main(final String[] args)
{
final Drink dartRoastDrink = new DartRoast();
final Drink espressoDrink = new Espresso();
final Drink Mocha = new Mocha(dartRoastDrink);
final Drink soy = new Soy(Mocha);
System.out.println(soy.getDesc() + soy.cost());
final Drink whip = new Whip(espressoDrink);
System.out.println(whip.getDesc() + whip.cost());
}
}
结果:
in DartRoast, add Mocha add Soy 65.0
in Espresso, add Whip 115.0
优点:
1)Decorator模式与继承关系的目的都是扩展对象功能,但是Decorator可以提供比继承更多的灵活性。
2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
缺点:
1)这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
2)装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否适合。当然也可以改变Component接口,增加新的公开的行为,实现"半透明"的装饰者模式。在实际项目中要做出最佳选择。
在java类库中的IO流就是用装饰者模式设计的。
相关推荐
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
### Java设计模式详解 在软件开发领域,设计模式是一种被广泛采用的解决方案,用来解决常见的设计问题。设计模式不仅能够帮助开发者写出可复用、可维护的代码,还能提高团队间的沟通效率。以下是对给定文件中提到的...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
Java设计模式详解涉及到23种设计模式,这些设计模式可以根据其目的和范围被划分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。下面将详细...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
总结来说,"JAVA 23种设计模式(全).Design Pattern_Java模式"这份资源是学习和掌握Java设计模式的重要工具。通过深入学习并熟练应用这些模式,开发者可以写出更高效、更易于维护的代码,同时提升个人的编程技能和...
总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。
### Java设计模式(第二版)中文版 #### 思维框架的培养;对新手与码农均适用 在软件开发领域,设计模式是一种被广泛采用的解决方案,它可以帮助开发者更好地组织代码、解决常见问题,并提高软件的整体质量和可维护...
根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的模板或最佳实践。GOF设计模式,全称为GoF(Gang of Four)设计模式,源自Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位...
《Java设计模式》是一本详尽介绍Java设计模式的电子书,旨在帮助不同层次的开发者提升他们的编程设计能力。本书涵盖了23种经典的设计模式,包括策略模式、代理模式、单例模式、多例模式等,旨在让读者理解如何编写出...
13. **装饰模式(DecoratorPattern)**:动态地给一个对象添加一些额外的职责。 14. **迭代器模式(IteratorPattern)**:提供一种方法顺序访问一个聚合对象中的各个元素。 15. **组合模式(CompositePattern)**...
Java设计模式尤其重要,因为Java是广泛应用的开发语言,尤其在企业级应用中占据主导地位。本资源“Java设计模式代码,设计模式系列所有示例代码”为学习者提供了实际操作设计模式的宝贵机会,使理论与实践相结合,...
装饰模式(Decorator Pattern)是Java设计模式中的一种结构型模式,它允许在运行时动态地向对象添加新的行为或职责,而不会破坏封装性。这种模式可以用来将多个功能组合在一起,同时保持类的可扩展性和灵活性。在...
java 设计模式 源码 欢迎访问DesignPattern项目 ...装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式(flyweightPattern) 代理模式(proxyPattern) 责任链模式(chainPattern) 命令模式(commandPatter
Java设计模式是指在Java编程语言中,根据软件工程原理,总结出的一系列在特定情况下用于解决特定问题的模板化代码。设计模式分为三大类:创建型、结构型和行为型,它们包含共23种不同的设计模式。 创建型模式关注的...
以下内容将详细介绍Java设计模式在UML类图中的表现形式,并结合常见的设计模式,例如策略模式、代理模式、观察者模式、抽象工厂模式等进行说明。 策略模式(Strategy Pattern):策略模式是一种行为设计模式,它...
Java设计模式是软件工程中的一种最佳实践,它提供了一种在特定情况下解决设计问题的通用模板。本课件集合了多种常见的设计模式,通过PPT形式深入浅出地进行了详尽讲解,旨在帮助开发者提高代码的可重用性、可读性...