装饰者模式coffee
时间: 2024-04-26 14:18:22 浏览: 8
装饰者模式是一种结构型设计模式,它允许在不改变原有对象的情况下,动态地将新功能添加到对象上。这种模式通过创建一个包装对象来实现,该包装对象包含了原始对象,并且可以在运行时添加新的行为。
在咖啡店中,装饰者模式可以用来实现各种不同口味的咖啡。假设我们有一个基础的咖啡类,例如"Espresso"(浓缩咖啡),我们可以通过装饰者模式来添加额外的配料,如牛奶、糖浆、巧克力等。
首先,我们定义一个抽象的咖啡接口,例如"Coffee",它包含了获取咖啡描述和计算价格的方法。然后,我们创建一个具体的咖啡类,例如"Espresso",它实现了咖啡接口,并提供了浓缩咖啡的描述和价格。
接下来,我们创建一个装饰者抽象类,例如"CoffeeDecorator",它也实现了咖啡接口,并包含一个指向被装饰对象的引用。然后,我们可以创建具体的装饰者类,如"MilkDecorator"(牛奶装饰者)和"SyrupDecorator"(糖浆装饰者),它们分别在原始咖啡的基础上添加了牛奶和糖浆。
通过使用装饰者模式,我们可以动态地组合不同的装饰者来创建各种口味的咖啡。例如,我们可以创建一个"Espresso"对象,然后用"MilkDecorator"装饰它,再用"SyrupDecorator"装饰它,最终得到一杯加了牛奶和糖浆的浓缩咖啡。
相关问题
java装饰者模式的运用
装饰者模式是一种结构型设计模式,它许在不改变原有对象的情况下,动态地将新功能添加到对象上。在Java中,装饰者模式常用于扩展或修改现有类的功能,同时保持代码的灵活性和可扩展性。
在装饰者模式中,有以下几个角色:
1. 抽象组件(Component):定义了被装饰对象和装饰对象的共同接口。
2. 具体组件(ConcreteComponent):实现了抽象组件接口,是被装饰的对象。
3. 抽象装饰者(Decorator):继承了抽象组件接口,并持有一个抽象组件对象的引用。
4. 具体装饰者(ConcreteDecorator):实现了抽象装饰者接口,负责对具体组件进行装饰。
下面是一个简单的示例,展示了如何使用装饰者模式来扩展一个咖啡店的咖啡功能:
```java
// 抽象组件
interface Coffee {
String getDescription();
double getCost();
}
// 具体组件
class SimpleCoffee implements Coffee {
@Override
public String getDescription() {
return "Simple Coffee";
}
@Override
public double getCost() {
return 1.0;
}
}
// 抽象装饰者
abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee decoratedCoffee) {
this.decoratedCoffee = decoratedCoffee;
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription();
}
@Override
public double getCost() {
return decoratedCoffee.getCost();
}
}
// 具体装饰者
class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
@Override
public String getDescription() {
return super.getDescription() + ", with Milk";
}
@Override
public double getCost() {
return super.getCost() + 0.5;
}
}
class SugarDecorator extends CoffeeDecorator {
public SugarDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
@Override
public String getDescription() {
return super.getDescription() + ", with Sugar";
}
@Override
public double getCost() {
return super.getCost() + 0.3;
}
}
public class Main {
public static void main(String[] args) {
// 创建一个简单咖啡对象
Coffee coffee = new SimpleCoffee();
System.out.println(coffee.getDescription() + " $" + coffee.getCost());
// 使用装饰者来添加牛奶和糖
Coffee coffeeWithMilkAndSugar = new SugarDecorator(new MilkDecorator(coffee));
System.out.println(coffeeWithMilkAndSugar.getDescription() + " $" + coffeeWithMilkAndSugar.getCost());
}
}
```
输出结果:
```
Simple Coffee $1.0
Simple Coffee, with Milk, with Sugar $1.8
```
在上述示例中,我们定义了一个抽象组件 `Coffee`,具体组件 `SimpleCoffee` 实现了抽象组件接口。然后,我们定义了抽象装饰者 `CoffeeDecorator`,它持有一个抽象组件对象的引用,并实现了抽象组件接口。具体装饰者 `MilkDecorator` 和 `SugarDecorator` 继承了抽象装饰者,并在其基础上添加了额外的功能。
在 `Main` 类中,我们首先创建了一个简单咖啡对象,并输出其描述和价格。然后,我们使用装饰者模式来添加牛奶和糖,并输出装饰后的咖啡描述和价格。
java装饰器模式案例
装饰器模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。下面是一个使用 Java 实现的装饰器模式案例:
假设有一个咖啡店,咖啡店提供基础的咖啡种类,比如 espresso、latte 等,而且每一种咖啡可以添加额外的配料,比如牛奶、糖浆等。我们可以使用装饰器模式来实现这个场景。
首先,我们定义一个咖啡接口:
```java
public interface Coffee {
double getCost();
String getDescription();
}
```
然后,我们实现基础咖啡类:
```java
public class BasicCoffee implements Coffee {
@Override
public double getCost() {
return 2.0;
}
@Override
public String getDescription() {
return "Basic coffee";
}
}
```
接下来,我们创建一个装饰器类,它将基础咖啡对象包装起来,并在其基础上添加额外的配料:
```java
public abstract class CoffeeDecorator implements Coffee {
protected final Coffee decoratedCoffee;
public CoffeeDecorator(Coffee decoratedCoffee) {
this.decoratedCoffee = decoratedCoffee;
}
public double getCost() {
return decoratedCoffee.getCost();
}
public String getDescription() {
return decoratedCoffee.getDescription();
}
}
```
最后,我们实现具体的装饰器类,比如添加牛奶的装饰器类:
```java
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
public double getCost() {
return super.getCost() + 0.5;
}
public String getDescription() {
return super.getDescription() + ", with milk";
}
}
```
现在,我们可以使用装饰器模式来创建一个具有不同配料的咖啡对象:
```java
Coffee basicCoffee = new BasicCoffee(); // 创建基础咖啡对象
Coffee milkCoffee = new MilkDecorator(basicCoffee); // 添加牛奶
Coffee syrupCoffee = new SyrupDecorator(milkCoffee); // 添加糖浆
System.out.println(syrupCoffee.getDescription()); // 输出 "Basic coffee, with milk, with syrup"
System.out.println(syrupCoffee.getCost()); // 输出 "3.0"
```
这样,我们就使用装饰器模式为基础咖啡对象添加了不同的配料,同时保持了代码的简洁性和可扩展性。