希赛考试网
首页 > 软考 > 软件设计师

装饰模式类图实例

希赛网 2024-06-09 12:31:08

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

```

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

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件