假设有一个咖啡店,需要根据客户的订单制作不同的咖啡饮料。这些饮料可以添加不同的调料,比如牛奶、摩卡等。为了实现这个功能,我们可以使用装饰者模式。
首先,我们定义一个基本的饮料接口 Beverage,它包含了计算价格和描述的方法:
public interface Beverage {
String getDescription();
double cost();
}
然后,我们实现一个具体的饮料类 Espresso,它是基本的咖啡饮料,没有任何调料:
public class Espresso implements Beverage {
public String getDescription() {
return "Espresso";
}
public double cost() {
return 1.99;
}
}
现在,我们来添加一些调料。为了方便,我们定义一个抽象的调料装饰者类 CondimentDecorator,它也实现了 Beverage 接口,并包含了一个指向被装饰对象的引用
public abstract class CondimentDecorator implements Beverage {
protected Beverage beverage;
}
然后,我们实现具体的调料装饰者类,比如牛奶、摩卡等:
public class Milk extends CondimentDecorator {
public Milk(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Milk";
}
public double cost() {
return beverage.cost() + 0.10;
}
}
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return beverage.cost() + 0.20;
}
}
现在,我们可以创建一个具体的咖啡饮料对象 espresso,然后添加调料:
Beverage espresso = new Espresso();
espresso = new Milk(espresso);
espresso = new Mocha(espresso);
最后,我们可以调用 getDescription() 和 cost() 方法来获取咖啡饮料的描述和价格:
System.out.println(espresso.getDescription() + " $" + espresso.cost());
Espresso, Milk, Mocha $2.29
这就是一个简单的使用装饰者模式的实际项目示例代码。通过使用装饰者模式,我们可以轻松地为对象添加新的功能,而无需修改其原始实现。