第三部分-设计模式-004装饰者模式

本文通过一个咖啡订购系统的实例,详细解释了如何使用装饰者模式进行设计。系统允许咖啡和调料的灵活扩展,饮料类包括咖啡父类、调料父类(即装饰者)和饮料父类。通过组合,调料对象可以装饰咖啡,实现价格和描述的动态变化。例如,深色咖啡加上牛奶和巧克力后,订单费用和描述会随着添加的调料而更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:
我们去咖啡店订购咖啡时,往往是先选择咖啡,然后再说加什么调料。
现在我们设计这样一个系统,方便咖啡、调料种类的扩展。
则我们的思路是:
咖啡父类----子类为各种咖啡
调料父类(装饰者,装饰咖啡的类)----子类为各种调料
饮料父类----子类为咖啡父类和调料父类

在这里插入图片描述
1、Drink父类代码

public abstract class Drink {
    public String des;  //描述
    private double price=0.0f;  //价格
    public String getDes() {
        return des;
    }
    public void setDes(String des) {
        this.des = des;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    //计算费用的抽象方法
    public abstract float cost();
}

2、Coffee父类代码

public class Coffee extends Drink {
    @Override
    public float cost() {
        return (float) this.getPrice();
    }
}

3、Decorator父类代码
为什么要组合这个Drink类,因为调料只是装饰,也就是说创建调料对象,必须得先有Drink

public class Decorator extends Drink {
	private Drink obj;
	public Decorator(Drink obj) {
		this.obj = obj;
	}
	@Override
	public float cost() {
		return (float) (this.getPrice() + obj.cost());
	}
	@Override
	public String getDes() {
		return des + " " + getPrice() + " && " + obj.getDes();
	}
}

4、咖啡子类代码

public class Espresso extends Coffee {
	public Espresso() {
		setDes("意大利咖啡");
		setPrice(6.0f);
	}
}
public class LongBlack extends Coffee {
	public LongBlack() {
		setDes("深色咖啡");
		setPrice(5.0f);
	}
}

5、调料子类代码

public class Milk extends Decorator {
	public Milk(Drink obj) {
		super(obj);
		setDes("牛奶");
		setPrice(2.0f); 
	}
}
public class Soy extends Decorator{
	public Soy(Drink obj) {
		super(obj);
		setDes("大豆");
		setPrice(1.5f);
	}
}

6、产生的订单代码

public class CoffeeBar {

	public static void main(String[] args) {
		//单点longblack
		Drink order = new LongBlack();
		System.out.println("单点longBlack费用 = " + order.cost());
		System.out.println("描述 = " + order.getDes());
		//加牛奶
		order = new Milk(order);
		System.out.println("添加牛奶后 = " + order.cost());
		System.out.println("描述 = " + order.getDes());
		//加两份巧克力
		order = new Chocolate(order);
		System.out.println("添加巧克力后 = " + order.cost());
		System.out.println("描述 = " + order.getDes());

		order = new Chocolate(order);
		System.out.println("再次添加巧克力 = " + order.cost());
		System.out.println("描述 = " + order.getDes());
	
		System.out.println("===========================");
		//单点DeCaf
		Drink order2 = new DeCaf();
		System.out.println("单点DeCaf费用 = " + order2.cost());
		System.out.println("描述 = " + order2.getDes());
		//添加牛奶
		order2 = new Milk(order2);
		System.out.println("添加牛奶 = " + order2.cost());
		System.out.println("描述 = " + order2.getDes());

	
	}

}

结果:
单点longBlack费用 = 5.0
描述 = 深色咖啡
添加牛奶后 = 7.0
描述 = 牛奶 2.0 && 深色咖啡
添加巧克力后 = 10.0
描述 = 巧克力 3.0 && 牛奶 2.0 && 深色咖啡
再次添加巧克力 = 13.0
描述 = 巧克力 3.0 && 巧克力 3.0 && 牛奶 2.0 && 深色咖啡

单点DeCaf费用 = 1.0
描述 = 无因咖啡
添加牛奶 = 3.0
描述 = 牛奶 2.0 && 无因咖啡

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值