装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你在运行时向对象动态添加功能,而不需要使用继承来实现这一功能扩展。
在装饰模式中,有四个角色:Component(组件)、ConcreteComponent(具体组件)、Decorator(装饰者)和ConcreteDecorator(具体装饰者)。
组件是定义了被装饰对象的抽象类或接口,具体组件是实现了组件的具体类,装饰者是继承了组件并包含了一个组件对象的抽象类或接口,具体装饰者是实现了装饰者的具体类。
下面以一个咖啡店为例子,分析装饰模式类图实例。
1. 组件
在咖啡店中,咖啡就是一个组件,它的抽象类可以定义为:
```
public abstract class Beverage {
protected String description;
public String getDescription() {
return description;
}
public abstract double cost();
}
```
这里定义了一种饮料(Beverage)类,它有一个描述(description)和一个计算价格(cost)的抽象方法。
2. 具体组件
现在,我们需要实现咖啡的具体类,比如浓缩咖啡(Espresso)和混合咖啡(HouseBlend):
```
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "House Blend Coffee";
}
public double cost() {
return 0.89;
}
}
```
这里为浓缩咖啡和混合咖啡分别创建了具体类,并实现了它们的描述和价格。
3. 装饰者
在咖啡店中,我们可以添加各种配料,比如牛奶、摩卡、奶泡等,这些都属于装饰者,比如牛奶(Milk):
```
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
public class Milk extends CondimentDecorator {
Beverage beverage;
public Milk(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", 豆浆";
}
public double cost() {
return 0.10 + beverage.cost();
}
}
```
这里定义了一个装饰者抽象类 CondimentDecorator,并让它继承了 Beverage 类。Milk 是具体的装饰者,它包含了一个 beverage 变量,用于保存咖啡的引用,从而实现在咖啡中添加牛奶的功能。
4. 具体装饰者
具体装饰者实现了装饰者的具体类,比如摩卡(Mocha):
```
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", 摩卡";
}
public double cost() {
return 0.20 + beverage.cost();
}
}
```
这里定义了一个具体的装饰者 Mocha,它同样包含了一个 beverage 变量,用于保存咖啡的引用,从而实现在咖啡中添加摩卡的功能。
如此一来,我们就可以使用装饰模式来给咖啡添加各种配料,比如:
```
Beverage espresso = new Espresso();
espresso = new Milk(espresso);
espresso = new Mocha(espresso);
```
这样就可以得到一杯牛奶摩卡浓缩咖啡。
扫码咨询 领取资料