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

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

原创博客,转载请注明出处:
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,设计模式)