JAVA设计模式之装饰者模式---奶茶点单

定义:装饰者模式就是指在不改变现有对象结构的情况下,动态地给对象增加一些职责(额外的功能)的设计模式。

UML 类图:

具体实现:

public abstract class Beverage {
    //抽象方法
    public abstract double cost();
}

 这个继承上一个抽象类,一些装饰内容通过继承这个抽象类实现,实现插拔式编程(也就是动态的)

public abstract class ToppingDecorator extends Beverage {
    public abstract double cost();
}

 被装饰(也就是固定内容)的内容继承最顶层的抽象方法

public class FruitTea extends Beverage {

    @Override
    public double cost() {
        System.out.println("FruitTea cost:  "+15) ;
        return 15;
    }
}

 装饰(也就是动态变化的内容)继承第二个抽象类

public class Pudding extends ToppingDecorator{

    private static final int COST = 2;
    private final Beverage beverage;

    public Pudding(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public double cost() {
        System.out.println("Adding pudding cost:  " +COST);
        return COST + beverage.cost();
    }
}

小编白话理解:

比如说 去奶茶点下单 奶茶 咖啡就是我们所说的固定内容,而给奶茶加布丁,加珍珠给咖啡加糖加奶就是动态内容;如果代码开始写死加糖加奶需要多少钱,新来的顾客需要加冰,那你就需要改变原来的代码逻辑 并且不能写错,否则会影响之前加糖加奶的逻辑,装饰者模式会在不影响加糖加奶的逻辑上通过继承ToppingDecorator实现加冰的逻辑计算

 调用逻辑:

Beverage milkTea = new MilkTea();//点了一杯奶茶
milkTea = new Boba(milkTea);
milkTea = new Boba(milkTea);//加两份珍珠
milkTea = new Pudding(milkTea);//加一份布丁
double cost = milkTea.cost();//计算价格

 计算结果:

Adding pudding cost:  2
Adding Boba cost:  3
Adding Boba cost:  3
MlikTea cost:  16
24.0

不理解的地方打在评论区,看见会解答 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您讲解一下如何使用Java中的装饰模式设计实现奶茶问题。 首先,我们可以定义一个基础的奶茶类,包含一些最基本的属性和方法,例如: ```java public abstract class MilkTea { String description = "Unknown Milk Tea"; public String getDescription() { return description; } public abstract double cost(); } ``` 接下来,我们可以定义一些具体的奶茶类,例如: ```java public class BlackMilkTea extends MilkTea { public BlackMilkTea() { description = "Black Milk Tea"; } public double cost() { return 10.0; } } public class GreenMilkTea extends MilkTea { public GreenMilkTea() { description = "Green Milk Tea"; } public double cost() { return 12.0; } } ``` 然后,我们可以定义一个装饰者类,用于对奶茶进行装饰,例如: ```java public abstract class MilkTeaDecorator extends MilkTea { public abstract String getDescription(); } ``` 接下来,我们可以定义一些具体的装饰类,例如: ```java public class PearlDecorator extends MilkTeaDecorator { private MilkTea milkTea; public PearlDecorator(MilkTea milkTea) { this.milkTea = milkTea; } public String getDescription() { return milkTea.getDescription() + ", add pearl"; } public double cost() { return milkTea.cost() + 2.0; } } public class PuddingDecorator extends MilkTeaDecorator { private MilkTea milkTea; public PuddingDecorator(MilkTea milkTea) { this.milkTea = milkTea; } public String getDescription() { return milkTea.getDescription() + ", add pudding"; } public double cost() { return milkTea.cost() + 3.0; } } ``` 最后,我们可以在客户端代码中进行测试,例如: ```java public class Client { public static void main(String[] args) { MilkTea milkTea = new BlackMilkTea(); milkTea = new PearlDecorator(milkTea); milkTea = new PuddingDecorator(milkTea); System.out.println(milkTea.getDescription() + " " + milkTea.cost()); } } ``` 以上就是使用Java中的装饰模式设计实现奶茶问题的示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值