设计模式实例学习-装饰者模式

原创 2015年11月17日 19:33:04

设计模式实例学习-装饰者模式

原创博客,转载请注明出处:
http://blog.csdn.net/u011035622/article/details/49892133


定义

概念定义

(结构型模式)

    动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生产子类更加灵活。

角色职责

  • 抽象构件:接口或抽象类
  • 具体构件:抽象构件的实现,被装饰的对象。
  • 抽象装饰者
  • 具体装饰者

实例分析

场景描述

  你有一个天使角色,天使一开始什么都没有,你需要给她添加翅膀、添加衣服、添加武器…以后也会根据情况需要另外添加其他的东西。

代码实现及讲解

  • 抽象构件 Angel.java
public abstract class Angel {
    //报告自己的身上有穿戴什么。
    abstract void ReportMyEquip();
}
  • 具体构件 AngelGirl.java
public class AngelGirl extends Angel{

    @Override
    void ReportMyEquip() {
        System.out.println("我是天使女孩~~");
    }

}
  • 抽象装饰者 AngelEquip.java
public abstract class AngelEquip extends Angel{

    private Angel angel;

    public AngelEquip(Angel _angel) {
        this.angel = _angel;
    }

    @Override
    void ReportMyEquip() {
        this.angel.ReportMyEquip();
    }

}
  • 具体装饰者
    AngelEqClothes.java:添加衣服
    AngelEqWeapon.java:装上武器
    AngelEqWing.java:带上翅膀
//装饰衣服
public class AngelEqClothes extends AngelEquip{

    public AngelEqClothes(Angel _angel) {
        super(_angel);
    }

    private void getClothes(){
        System.out.println("穿上了天使衣服.");
    }

    @Override
    void ReportMyEquip() {
        super.ReportMyEquip();
        this.getClothes();
    }
}
//装饰武器
public class AngelEqWeapon extends AngelEquip{

    public AngelEqWeapon(Angel _angel) {
        super(_angel);
    }

    private void getWeapon(){
        System.out.println("我装上了武器.");
    }

    @Override
    void ReportMyEquip() {
        super.ReportMyEquip();
        this.getWeapon();
    }

}
//装饰翅膀
public class AngelEqWing extends AngelEquip{

    public AngelEqWing(Angel _angel) {
        super(_angel);
    }

    private void getWing(){
        System.out.println("我装上了翅膀.");
    }

    @Override
    void ReportMyEquip() {
        super.ReportMyEquip();
        this.getWing();
    }
}
  • 场景类
package decorator;

public class Main {
    public static void main(String[] args) {
        Angel angel = new AngelGirl();
        angel = new AngelEqWing(angel);
        angel = new AngelEqClothes(angel);
        angel = new AngelEqWeapon(angel);
        angel.ReportMyEquip();

        System.out.println("------");
        //另一种写法,本质是一样的。
        Angel angel2 = new AngelEqWeapon(new AngelEqClothes(new AngelEqWing(new AngelGirl())));
        angel2.ReportMyEquip();
    }
}

输出:

我是天使女孩~~
我装上了翅膀.
穿上了天使衣服.
我装上了武器.
------
我是天使女孩~~
我装上了翅膀.
穿上了天使衣服.
我装上了武器.

  通过具体装饰类在外层不断为构件加以装饰,最终得到一个拥有各种装饰的构件。像这个DEMO中为天使添加武器、衣服、翅膀,只需要添加一个装饰类,就能添加一个新的功能(装饰),这就是装饰者模式的应用。


装饰者模式优缺点

优点

  • 装饰者与构件之间解耦,独立发展。
  • 相当于继承的替代方案,符合多组合,少继承的原则。
  • 可以动态的拓展装饰类,添加新功能,拓展性好。

缺点

  • 多层装饰复杂性高,使用装饰者模式时应减少装饰的层数,降低复杂性。

应用场景

  1. 拓展类的新功能及附加功能。
  2. 动态装饰构件,增加及撤销功能。
  3. 改装一批兄弟类。

JAVA设计模式初探之装饰者模式

这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常...
  • jason0539
  • jason0539
  • 2014年04月01日 09:07
  • 75122

JavaScript设计模式----装饰者模式

装饰者模式的定义:装饰者(decorator)模式能够在不改变对象自身的基础上,在程序运行期间给对像动态的添加职责。与继承相比,装饰者是一种更轻便灵活的做法。装饰者模式的特点:可以动态的给某个对象添加...
  • yisuowushinian
  • yisuowushinian
  • 2016年07月17日 20:00
  • 3405

Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,...
  • nugongahou110
  • nugongahou110
  • 2015年12月27日 19:40
  • 2882

简单实例理解装饰者设计模式

1.装饰设计模式: 将一个对象作为参数进行传递,然后对这个对象进行包装---改变其中的方法或者添加一些新的行为---装饰设计模式---装饰者模式---Decorate Model 改变一个...
  • dhcao1112
  • dhcao1112
  • 2017年07月28日 16:32
  • 266

Net设计模式实例之装饰者模式(Decorator Pattern)

一、装饰模式简介(Brief Introduction) 动态地给一个对象添加一些额外的职责。 优点:把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。...
  • my98800
  • my98800
  • 2017年01月14日 12:56
  • 144

设计模式php实例:装饰者模式

扩展一个类一般可以使用继承或者组合的形式。使用继承的方式扩展时,随着基类子类的增多,以及子类的子类出现,继而出现了代码的无限制膨胀,增加了系统的复杂性。而使用装饰者模式既继承又引用,能动态扩展类的一些...
  • wzllai
  • wzllai
  • 2012年08月06日 16:42
  • 2273

大话设计模式--装饰者模式 Decorator -- C++实现实例

1.装饰者模式 Decorator 动态地给一个对象添加一个额外的职责, 就添加功能来说, 装饰模式比生成子类更为灵活。 每个装饰对象的实现和如何使用这个对象分离,  每个装饰对象只关心自己的功能,不...
  • xj626852095
  • xj626852095
  • 2013年10月08日 14:46
  • 518

设计模式-装饰者

  • 2015年11月07日 10:44
  • 4.44MB
  • 下载

设计模式之装饰者(Decorator)

  • 2007年09月27日 14:38
  • 316KB
  • 下载

headfast设计模式学习笔记02 装饰者

引入设计原则:类应该对扩展开放,对修改关闭 目的:是类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。 如观察者模式,装饰者模式。 注意:1没必要每个部分都遵循开放-关闭原则,因为...
  • zhangbinHn
  • zhangbinHn
  • 2015年04月02日 10:55
  • 351
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式实例学习-装饰者模式
举报原因:
原因补充:

(最多只允许输入30个字)