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

原创 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. 改装一批兄弟类。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

1.装饰设计模式: 将一个对象作为参数进行传递,然后对这个对象进行包装---改变其中的方法或者添加一些新的行为---装饰设计模式---装饰者模式---Decorate Model 改变一个...

设计模式-装饰者

  • 2015-11-07 10:44
  • 4.44MB
  • 下载

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

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

《HeadFirst设计模式》学习笔记2-装饰者模式

说明装饰者模式动态地将责任附加到对象上。若要拓展功能,装饰着提供了比继承更有弹性的替代方案。类图要点 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。 在我们的设计中,应该允许行为被扩展,而无...

设计模式—装饰者模式

  • 2016-01-04 22:28
  • 478KB
  • 下载

设计模式装饰者模式

设计模式之装饰者模式案例学习

装饰者模式:顾名思义将对象装饰的更加漂亮,只是更漂亮,他还是他,没有改变类型。 官方定义:动态的将责任附加到对象上。若要扩展功能,装饰着提供了比继承更有弹性的替代方案。 案例情景: 煎饼果子(panc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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