动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活。
——《设计模式:可复用面向对象软件的基础》
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中对于流的处理用到了装饰器模式: