动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活。
——《设计模式:可复用面向对象软件的基础》
UML图:

下面我们以人为基础说明装饰器模式,人可以有房子(有房的人),车子(有车的人),票子(有钱的人)....
public interface Man {
String manDesc();
}
public class BaseMan implements Man {
@Override
public String manDesc() {
return "人";
}
}
装饰类:
public abstract class Decorator implements Man {
protected final Man man;
public Decorator(Man man) {
this.man = man;
}
}
public class MoneyMan extends Decorator {
public MoneyMan(Man man) {
super(man);
}
@Override
public String manDesc() {
return "有钱的" + man.manDesc();
}
}
public class CarMan extends Decorator {
public CarMan(Man man) {
super(man);
}
@Override
public String manDesc() {
return "有车的" + man.manDesc();
}
}
public class HouseMan extends Decorator {
public HouseMan(Man man) {
super(man);
}
@Override
public String manDesc() {
return "有房的" + man.manDesc();
}
}
client:
public class DecorateDemo {
public static void main(String[] args) {
Man man = new BaseMan();
//有钱
Man moneyMan = new MoneyMan(man);
//有车
Man carMan = new CarMan(moneyMan);
//有房
Man houseMan = new HouseMan(carMan);
System.out.println(houseMan.manDesc());
}
}
输出:
有房的有车的有钱的人
jdk中对于流的处理用到了装饰器模式:

这篇博客介绍了装饰器模式的概念,通过一个以人为核心的例子展示了如何使用装饰器模式来动态地给人添加有房、有车、有钱等职责。文章还提到了Java SDK中流处理对装饰器模式的应用,并提供了相关代码实现。

被折叠的 条评论
为什么被折叠?



