定义
装饰着模式动态的将责任附加到对象上,若要扩展功能,装饰着提供了比继承更有弹性的替代方案。
设计原则
类应该对扩展开放,对修改关闭。
代码demo
基类
public abstract class Beverage {
String desc;
public String getDescription(){
return desc;
}
public abstract int cost();
}
衍生的众多小类
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
public class Espresso extends Beverage{
public Espresso(){
desc = "Espresso";
}
@Override
public int cost() {
return 10;
}
}
public class Houseblend extends Beverage{
public Houseblend(){
desc= "Houseblend";
}
@Override
public int cost() {
return 20;
}
}public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",mocha";
}
@Override
public int cost() {
return 8+beverage.cost();
}
}
public class Suger extends CondimentDecorator{
Beverage beverage;
public Suger(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",sugar";
}
@Override
public int cost() {
return 4+beverage.cost();
}
}
测试
public class Unittest {
public static void main(String[] args) {
Beverage be = new Suger(new Mocha(new Houseblend()));
String bedesc =be.getDescription();
int becost = be.cost();
System.out.println(bedesc);
System.out.println(be.cost());
}
}
代码解读
装饰着和被装饰者对象有相同的超类型
你可以用一个或者多个装饰者包装一个对象
装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
java中的IO属于装饰者的一个实例。