介绍
概述:装饰模式是一种对象结构型模型,动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类对象更加灵活的替代方案实现:4个角色 (1)Component(抽象构件): (2)ConcreteComponent(具体构件) (3)Decorator(抽象装饰类) (4)ConcreteDecorator(具体装饰类)
案例
实例说明:某咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用。现使用装饰模式为该咖啡店设计一个程序以实现计算费用的功能,输出每种饮料的详细描述及花费。
类图
实现
抽象构件Beverage类:
package com.design.DecoratorMode;
public abstract class Beverage {
public abstract String getDescription();
public abstract double getCost();
}
具体构建类Espresso
package com.design.DecoratorMode;
public class Espresso extends Beverage{
@Override
public String getDescription() {
return "Espresso 咖啡";
}
@Override
public double getCost() {
return 25;
}
}
抽象装饰类CondimentDecorator
package com.design.DecoratorMode;
public class CondimentDecorator extends Beverage{
private Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double getCost() {
return beverage.getCost();
}
}
具体装饰类Milk与Mocha:
package com.design.DecoratorMode;
public class Milk extends CondimentDecorator{
public Milk(Beverage beverage) {
super(beverage);
}
public String getDescription(){
return super.getDescription() + this.addMilk();
}
public double getCost(){
return super.getCost()+this.addMilkCost();
}
// 新增业务方法
public String addMilk(){
return "加牛奶";
}
public double addMilkCost(){
return 6;
}
}
package com.design.DecoratorMode;
public class Mocha extends CondimentDecorator{
public Mocha(Beverage beverage) {
super(beverage);
}
public String getDescription(){
return super.getDescription() + this.addMocha();
}
public double getCost(){
return super.getCost() + this.addMochaCost();
}
private double addMochaCost() {
return 10;
}
private String addMocha() {
return "加摩卡";
}
}
测试类StarBuzzCoffee
package com.design.DecoratorMode;
/**
* @author devByHfj
* @description com.design.DecoratorMode
* @create 2022-03-28 18:49
*/
public class StarBuzzCoffee {
public static void main(String[] args) {
Beverage b1, b2, b3;
b1 = new Espresso();
// 这里交给大家补充一个HouseBlend类
// b1 = new HouseBlend();
System.out.println("饮料:" + b1.getDescription());
System.out.println("价格:" + b1.getCost());
System.out.println("----------------------------");
b2 = new Milk(b1);
System.out.println("饮料:" + b2.getDescription());
System.out.println("价格:" + b2.getCost());
System.out.println("----------------------------");
b3 = new Mocha(b2);
System.out.println("饮料:" + b3.getDescription());
System.out.println("价格:" + b3.getCost());
System.out.println("----------------------------");
}
}
结果
|