java使用装饰器模式和桥接模式实现大中小尺寸的咖啡和调料尺寸的功能
时间: 2024-02-01 19:13:55 浏览: 23
装饰器模式和桥接模式可以很好地实现大中小尺寸的咖啡和调料尺寸的功能。
首先,我们需要定义一个基础的咖啡类,它有一个getSize()方法,返回咖啡的大小(大、中、小)。
```java
public abstract class Coffee {
protected String description = "Unknown coffee";
public String getDescription() {
return description;
}
public abstract double cost();
public abstract String getSize();
}
```
然后,我们定义三个具体的咖啡类,分别是SmallCoffee、MediumCoffee和LargeCoffee,它们分别实现getSize()方法,返回不同的咖啡大小。
```java
public class SmallCoffee extends Coffee {
public SmallCoffee() {
description = "Small Coffee";
}
public double cost() {
return 2.5;
}
public String getSize() {
return "Small";
}
}
public class MediumCoffee extends Coffee {
public MediumCoffee() {
description = "Medium Coffee";
}
public double cost() {
return 3.5;
}
public String getSize() {
return "Medium";
}
}
public class LargeCoffee extends Coffee {
public LargeCoffee() {
description = "Large Coffee";
}
public double cost() {
return 4.5;
}
public String getSize() {
return "Large";
}
}
```
接下来,我们使用装饰器模式为咖啡添加调料。我们定义一个CondimentDecorator抽象类,它继承自Coffee类,并包含一个protected成员变量,即被装饰的咖啡对象。在CondimentDecorator中,我们重写getDescription()方法,将被装饰的咖啡的描述和调料的描述拼接起来。
```java
public abstract class CondimentDecorator extends Coffee {
protected Coffee coffee;
public abstract String getDescription();
}
```
然后,我们定义三个具体的调料类,分别是Milk、Sugar和Whip,它们继承自CondimentDecorator类。在这些具体的调料类中,我们实现getDescription()方法,将被装饰的咖啡的描述和调料的描述拼接起来,并实现cost()方法,返回咖啡的价格加上调料的价格。
```java
public class Milk extends CondimentDecorator {
public Milk(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Milk";
}
public double cost() {
return coffee.cost() + 0.5;
}
public String getSize() {
return coffee.getSize();
}
}
public class Sugar extends CondimentDecorator {
public Sugar(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Sugar";
}
public double cost() {
return coffee.cost() + 0.3;
}
public String getSize() {
return coffee.getSize();
}
}
public class Whip extends CondimentDecorator {
public Whip(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Whip";
}
public double cost() {
return coffee.cost() + 0.7;
}
public String getSize() {
return coffee.getSize();
}
}
```
最后,我们使用桥接模式将咖啡的大小和调料的尺寸分离开来。我们定义一个Size接口,其中包含一个getSize()方法,返回咖啡的大小(大、中、小)。然后,在Coffee类中包含一个Size成员变量,并实现getSize()方法,返回这个Size对象的getSize()方法的返回值。这样,我们就可以在咖啡的装饰器中引用这个Size对象,从而实现咖啡大小和调料尺寸的组合。
```java
public interface Size {
public String getSize();
}
public class SmallSize implements Size {
public String getSize() {
return "Small";
}
}
public class MediumSize implements Size {
public String getSize() {
return "Medium";
}
}
public class LargeSize implements Size {
public String getSize() {
return "Large";
}
}
public abstract class Coffee {
protected String description = "Unknown coffee";
protected Size size;
public String getDescription() {
return description;
}
public abstract double cost();
public String getSize() {
return size.getSize();
}
public void setSize(Size size) {
this.size = size;
}
}
public class SmallCoffee extends Coffee {
public SmallCoffee() {
description = "Small Coffee";
size = new SmallSize();
}
public double cost() {
return 2.5;
}
}
public class MediumCoffee extends Coffee {
public MediumCoffee() {
description = "Medium Coffee";
size = new MediumSize();
}
public double cost() {
return 3.5;
}
}
public class LargeCoffee extends Coffee {
public LargeCoffee() {
description = "Large Coffee";
size = new LargeSize();
}
public double cost() {
return 4.5;
}
}
public abstract class CondimentDecorator extends Coffee {
protected Coffee coffee;
public abstract String getDescription();
}
public class Milk extends CondimentDecorator {
public Milk(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Milk";
}
public double cost() {
double cost = coffee.cost();
if (coffee.getSize().equals("Small")) {
cost += 0.3;
} else if (coffee.getSize().equals("Medium")) {
cost += 0.5;
} else if (coffee.getSize().equals("Large")) {
cost += 0.7;
}
return cost;
}
}
public class Sugar extends CondimentDecorator {
public Sugar(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Sugar";
}
public double cost() {
double cost = coffee.cost();
if (coffee.getSize().equals("Small")) {
cost += 0.2;
} else if (coffee.getSize().equals("Medium")) {
cost += 0.3;
} else if (coffee.getSize().equals("Large")) {
cost += 0.4;
}
return cost;
}
}
public class Whip extends CondimentDecorator {
public Whip(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Whip";
}
public double cost() {
double cost = coffee.cost();
if (coffee.getSize().equals("Small")) {
cost += 0.4;
} else if (coffee.getSize().equals("Medium")) {
cost += 0.6;
} else if (coffee.getSize().equals("Large")) {
cost += 0.8;
}
return cost;
}
}
```
这样,我们就可以通过组合咖啡和调料的方式实现不同尺寸的咖啡和调料尺寸的功能了。例如,下面的代码创建了一个小杯加牛奶和糖的咖啡,并输出了它的描述和价格。
```java
Coffee coffee = new SmallCoffee();
coffee = new Milk(coffee);
coffee = new Sugar(coffee);
System.out.println(coffee.getDescription() + " $" + coffee.cost());
```