装饰模式(Decorator)
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
首先有那么一个裸睡的人,早上起来准备穿衣服了,如下,show方法显示他穿衣服的步骤
package com.wxl.design.decorator;
/**
* 个人
*/
public abstract class Person {
/**
* 调用时打印此人所穿的服饰
*/
abstract void show() ;
}
为了更好的穿衣服,搞了一个穿衣服器(装饰器)
package com.wxl.design.decorator;
/**
* 装饰器
*/
public class Costume extends Person{
/**
* 被装饰的对象
*/
private Costume costume;
/**
* 覆盖show方法,调用costume对象的show方法
*/
@Override
public void show() {
if (costume != null) {
costume.show();
}
}
public void setCostume(Costume costume) {
this.costume = costume;
}
}
装饰器覆盖show方法但是却不掉用自身而是调用被装饰对象的show方法,接下来就可以开始穿了
package com.wxl.design.decorator;
public class CostumeA extends Costume {
@Override
public void show() {
super.show();
//在被装饰对象的show方法调用之后调用
wearSuit();
}
/**
* 独特的方法
*/
private void wearSuit() {
System.out.println("穿内衣");
System.out.println("穿内裤");
}
}
他先穿内衣裤,然后穿袜子
package com.wxl.design.decorator;
public class CostumeB extends Costume {
@Override
public void show() {
super.show();
//在被装饰对象的show方法调用之后调用
wearEquipment();
}
/**
* 独特的方法
*/
private void wearEquipment() {
System.out.println("袜子");
}
}
最后
package com.wxl.design.decorator;
public class Main {
public static void main(String[] args) {
System.out.println("小明今天穿了:");
Costume costume = new Costume();
CostumeA costumeA = new CostumeA();
costumeA.setCostume(costume);
CostumeB costumeB = new CostumeB();
costumeB.setCostume(costumeA);
costumeB.show();
}
}
运行结果:
小明今天穿了:
西服
西裤
雨伞
袋子