设计模式——装饰者模式

什么是装饰者模式

动态地给一个对象增加一些额外的职责,注意是动态的添加额外的职责,一般情况下,我们都是通过继承关系来扩展类的功能,这种方式是静态的方式扩展对象的职责(职责已经用代码写死了),久而久之,这个类就会变得十分臃肿(一堆继承关系),而装饰者模式将继承关系变为了关联关系,使对象职责的扩展变得十分容易

 

装饰者模式的角色

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都没有固定,均可以灵活变换,但是装饰者模式会导致类的数目急剧增多,并且装饰者模式有一点责任链模式的味道,此时便会有些杂乱,装饰者模式本身满足开闭原则

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值