装饰者模式Deorator

Designer Pattern 中介绍说:
装饰者模式的目的就是动态的给一个对象添加一些额外的功能的职责。给对象添加功能而言,比生成子类更加灵活。
别名:(Wrapper)包装器模式
我们在实践中经常会遇到想要一个对象添加若干功能而不是对类添加。我们可以通过子类继承的方式实现功能的添加,但是这种方法不够灵活,因为我们无法控制功能启用的时机。那么一种能够灵活的将功能嵌入对象中的软件设计方式,我们称之为装饰者模式。

以星巴克咖啡订单项目为例演示一下:
1 咖啡种类:单品咖啡:意大利浓咖啡(Espresso) ShortBlack, LongBlack(美式咖啡)Decarf(无因咖啡)
2 添加的调味品:Milk ,Soy,Chocolate
3 要求在扩展咖啡种类时,具有良好的扩展性,改动方案,维护方便
4 咖啡的费用:客户可以单点咖啡,也可以单品咖啡+调味品进行组和

Espresso在这里插入图片描述Espresso 是单品咖啡
Coffee 可有可无
Drink 组和的抽象类
Decorator 装饰者,包含Drink抽象类,cost方法是计算费用
Soy 等是调料

如果点一份Longblack+两份巧克力+一份牛奶。那么调用关系如图,就是递归调用。这样维护起来简单也方便一些。
在这里插入图片描述代码:
Drink抽象类:
@Data
public abstract class Drink {
public String des;//描述
private float price = 0.0f;

//计算费用的抽象方法,由子类实现
public abstract float cost();

}

Coffee 抽象的咖啡 :
public class Coffee extends Drink {
@Override
public float cost() {
return super.getPrice();
}
}

LongBlack 咖啡:
public class LongBlack extends Coffee {
public LongBlack(){
setDes(“美式黑咖啡”);
setPrice(5.0f);
}
}
其他具体咖啡实例,类似的写法,这里不做多次书写。

Decorator 装饰者:
public class Decorator extends Drink {
private Drink dri;

public Decorator(Drink dri){
    this.dri = dri;
}

@Override
//调料价格和单品咖啡价格
public float cost() {
    return super.getPrice()+dri.cost();
}
@Override
public String getDes(){
    //输出被装饰者的信息 dri.getDes()
    return des +getPrice()+"&&"+dri.getDes();
}

}
调料:
Milk
public class Milk extends Decorator {
public Milk(Drink dri) {
super(dri);
setDes(“牛奶”);
setPrice(3.5f);
}
}
Chocolate:
public class Chocolate extends Decorator {
public Chocolate(Drink dri) {
super(dri);
setDes(“巧克力”);
setPrice(3.0f);
}

CoffeeBar(测试)
public class CoffeeBar {
@Test
public void test01(){
Decorator milk = new Milk(new LongBlack());
String des = milk.getDes();
float cost = milk.cost();
System.out.println(des+"\n"+cost);
System.out.println("=================");
//加两份巧克力,一份牛奶的LongBlack
Chocolate chocolate = new Chocolate(new Chocolate(new Milk(new LongBlack())));
String des1 = chocolate.getDes();
float cost1 = chocolate.cost();
System.out.println(“订单信息:\t”+des1);
System.out.println(“价格:\t”+cost1);
System.out.println(new LongBlack());
}
}
测试结果:
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值