什么是装饰者模式
动态地给一个对象增加一些额外的职责,注意是动态的添加额外的职责,一般情况下,我们都是通过继承关系来扩展类的功能,这种方式是静态的方式扩展对象的职责(职责已经用代码写死了),久而久之,这个类就会变得十分臃肿(一堆继承关系),而装饰者模式将继承关系变为了关联关系,使对象职责的扩展变得十分容易
装饰者模式的角色
Component:抽象构建
ConcreteComponent:具体构建
Decorate:抽象装饰类
ConcreteDecorate:具体装饰类
假设现在有一家咖啡店,可以往咖啡里加冰、牛奶
Component:
public interface Component {
int getPrice();
}
Decorate:
public interface Decorate extends Component{
}
coffee:
public class coffee implements Component{
@Override
public int getPrice() {
return 10;
}
}
ice:
public class ice implements Decorate{
Component com;
public ice(Component com){
this.com=com;
}
@Override
public int getPrice() {
return 3+com.getPrice();
}
}
milk:
public class milk implements Decorate{
Component com;
public milk(Component com){
this.com=com;
}
@Override
public int getPrice() {
return com.getPrice()+2;
}
}
main:
public class main {
public static void main(String[] args){
Component cof0=new coffee();
Component cof1=new ice(cof0);
Component cof2=new milk(cof1);
System.out.println(cof2.getPrice());
}
}
执行结果:
可以看到,装饰者模式有点责任链模式的味道,它是一层一层包装商品的:
而调用getPrice()时,从外到里依次执行,一层一层的包装商品
装饰者模式的一点思考
装饰者模式与桥接模式的区别:两者体现的都是关联关系,看上去似乎差不多,但两者又有显著区别
桥接模式会将一个事物分成几个固定的维度,在这几个固定的维度上进行扩展,例如图形可以分为颜色、形状两个维度,接着可以在形状维度上扩展出各种形状,但维度个数不会发生变化,而装饰者模式可以添加维度的个数,例如添加一个大小维度,装饰者模式比桥接模式更加自由,拿XoY坐标轴来进一步理解,桥接模式相当于固定了x,y值可以不断变化,而装饰者模式x与y都没有固定,均可以灵活变换,但是装饰者模式会导致类的数目急剧增多,并且装饰者模式有一点责任链模式的味道,此时便会有些杂乱,装饰者模式本身满足开闭原则