设计模式之装饰者模式篇

定义

动态的将责任附加到对象上。若要扩展此功能,装饰者提供了比继承更有弹性的替代方案。

类图

这里写图片描述

以卖饮料为例

代码实现

首先定义了一个抽象的饮料的父类,具有两个方法,分别是描述信息和价格

abstract class Drink{
    String description="这是饮料";
    public  String getDescription(){
        return description;
    }
    public abstract  double cost();
}

其次定义了一个抽象的装饰类,只有一个描述方法

abstract class ComdientDecoration extends Drink{
    public abstract String getDescription(); 
}

继而定义了两种coffee,继承了Drink父类,并重写了父类的描述信息的方法,实现了价格方法。

class Coffee1 extends Drink{
    @Override
    public String getDescription() {
        return "Coffee1";
    }
    @Override
    public double cost() {
        return 5;
    }
}
class Coffee2 extends Drink{
    @Override
    public String getDescription() {
        return "Coffee2";
    }
    @Override
    public double cost() {
        return 6;
    }
}

最后看一下装饰类,装饰材料有牛奶,摩卡。当我们加上辅料时,就需要在未加辅料的基础上加上辅料的价格,才是该类型饮料的真实价格。同理还需要在未加辅料的基础上加上辅料的信息形成该类型饮料的描述信息。所以在实现的时候,我们只需要调用饮料的cost方法再加上当前辅料的价格即可。同理描述信息的实现为调用饮料的getDescription方法在加上当前辅料组成新的描述信息

class Milk extends ComdientDecoration{
    Drink drink;
    public Milk(Drink drink){
        this.drink=drink;
    }
    @Override
    public String getDescription() {
        return drink.getDescription()+", Milk";
    }
    @Override
    public double cost() {
        return drink.cost()+1;
    }

}
class Mocha extends ComdientDecoration{
    Drink drink;
    public Mocha(Drink drink) {
        this.drink=drink;
    }
    @Override
    public String getDescription() {
        return drink.getDescription()+", Mocha";
    }

    @Override
    public double cost() {
        return drink.cost()+2;
    }

}

结果展示

这里写图片描述

优点

  1. 允许行为可以扩展,而无需修改现有的代码
  2. 可以用无数个装饰者装饰一个组件

缺点

  1. 使用装饰者模式容易出现许多小的对象类,如果过度使用,会使得程序变得很复杂

java中的装饰者模式

java中有许多类也使用到来了装饰者模式,比如文件操作,感兴趣的同学可以自行研究一下~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值