`
youyu4
  • 浏览: 440522 次
社区版块
存档分类
最新评论

Java设计模式九:装饰模式(Decorator Pattern)

 
阅读更多

装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰模式的特点:
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)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    java设计模式ppt

    ### Java设计模式详解 在软件开发领域,设计模式是一种被广泛采用的解决方案,用来解决常见的设计问题。设计模式不仅能够帮助开发者写出可复用、可维护的代码,还能提高团队间的沟通效率。以下是对给定文件中提到的...

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    java设计模式详解,java design pattern

    Java设计模式详解涉及到23种设计模式,这些设计模式可以根据其目的和范围被划分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。下面将详细...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    JAVA 23种设计模式(全).Design Pattern_Java模式

    总结来说,"JAVA 23种设计模式(全).Design Pattern_Java模式"这份资源是学习和掌握Java设计模式的重要工具。通过深入学习并熟练应用这些模式,开发者可以写出更高效、更易于维护的代码,同时提升个人的编程技能和...

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    Java设计模式(第二版)中文版

    ### Java设计模式(第二版)中文版 #### 思维框架的培养;对新手与码农均适用 在软件开发领域,设计模式是一种被广泛采用的解决方案,它可以帮助开发者更好地组织代码、解决常见问题,并提高软件的整体质量和可维护...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    java设计模式代码

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的模板或最佳实践。GOF设计模式,全称为GoF(Gang of Four)设计模式,源自Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位...

    java设计模式(电子书)

    《Java设计模式》是一本详尽介绍Java设计模式的电子书,旨在帮助不同层次的开发者提升他们的编程设计能力。本书涵盖了23种经典的设计模式,包括策略模式、代理模式、单例模式、多例模式等,旨在让读者理解如何编写出...

    Java设计模式经典搞笑珍藏

    13. **装饰模式(DecoratorPattern)**:动态地给一个对象添加一些额外的职责。 14. **迭代器模式(IteratorPattern)**:提供一种方法顺序访问一个聚合对象中的各个元素。 15. **组合模式(CompositePattern)**...

    Java设计模式代码,设计模式系列所有示例代码

    Java设计模式尤其重要,因为Java是广泛应用的开发语言,尤其在企业级应用中占据主导地位。本资源“Java设计模式代码,设计模式系列所有示例代码”为学习者提供了实际操作设计模式的宝贵机会,使理论与实践相结合,...

    java设计模式之装饰模式

    装饰模式(Decorator Pattern)是Java设计模式中的一种结构型模式,它允许在运行时动态地向对象添加新的行为或职责,而不会破坏封装性。这种模式可以用来将多个功能组合在一起,同时保持类的可扩展性和灵活性。在...

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    java 设计模式 源码 欢迎访问DesignPattern项目 ...装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式(flyweightPattern) 代理模式(proxyPattern) 责任链模式(chainPattern) 命令模式(commandPatter

    Java的23种设计模式

    Java设计模式是指在Java编程语言中,根据软件工程原理,总结出的一系列在特定情况下用于解决特定问题的模板化代码。设计模式分为三大类:创建型、结构型和行为型,它们包含共23种不同的设计模式。 创建型模式关注的...

    java 设计模式类图

    以下内容将详细介绍Java设计模式在UML类图中的表现形式,并结合常见的设计模式,例如策略模式、代理模式、观察者模式、抽象工厂模式等进行说明。 策略模式(Strategy Pattern):策略模式是一种行为设计模式,它...

    Java 设计模式 课件 PPT

    Java设计模式是软件工程中的一种最佳实践,它提供了一种在特定情况下解决设计问题的通用模板。本课件集合了多种常见的设计模式,通过PPT形式深入浅出地进行了详尽讲解,旨在帮助开发者提高代码的可重用性、可读性...

Global site tag (gtag.js) - Google Analytics