软考
APP下载

装饰模式类图实例

装饰模式(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);

```

这样就可以得到一杯牛奶摩卡浓缩咖啡。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库