设计模式实例学习-装饰者模式
原创博客,转载请注明出处:
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中为天使添加武器、衣服、翅膀,只需要添加一个装饰类,就能添加一个新的功能(装饰),这就是装饰者模式的应用。
装饰者模式优缺点
优点
- 装饰者与构件之间解耦,独立发展。
- 相当于继承的替代方案,符合多组合,少继承的原则。
- 可以动态的拓展装饰类,添加新功能,拓展性好。
缺点
- 多层装饰复杂性高,使用装饰者模式时应减少装饰的层数,降低复杂性。
应用场景
- 拓展类的新功能及附加功能。
- 动态装饰构件,增加及撤销功能。
- 改装一批兄弟类。