装饰者模式

场景

  • 星巴克咖啡店

饮品

  • 蒸馏咖啡
  • 混合搅拌咖啡

如上的饮品都可以加 牛奶抹茶 等等:

image-20210806112622519

image-20210806112701451

装饰者模式定义

在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

角色

抽象构件(Component)角色

定义一个抽象接口以规范准备接收附加责任的对象

具体构件(Concrete Component)角色

实现抽象构件,通过装饰角色为其添加一些职责

抽象装饰(Decorator)角色

继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能

具体装饰(ConcreteDecorator)角色

实现抽象装饰的相关方法,并给具体构件对象添加附加的责任

代码实现

定义饮品与品类

image-20210807122402933

Beverage.java

/**
 * @author BNTang
 * @program design-pattern-pro
 * @date Created in 2021/10/12 012 11:34
 * @description
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public abstract class Beverage {

    private float price;
    private String desc;

    /**
     * 成本
     *
     * @return float
     */
    public abstract float cost();
}

HouseBlend.java

/**
 * @author BNTang
 * @program design-pattern-pro
 * @date Created in 2021/10/12 012 11:36
 * @description
 **/
public class HouseBlend extends Beverage {

    public HouseBlend() {
        super(30, "混合咖啡~");
    }

    @Override
    public float cost() {
        return getPrice();
    }
}

Espresso.java

/**
 * @author BNTang
 * @program design-pattern-pro
 * @date Created in 2021/10/12 012 11:38
 * @description
 **/
public class Espresso extends Beverage {

    public Espresso() {
        super(20, "意大利咖啡~");
    }

    @Override
    public float cost() {
        return getPrice();
    }
}

定义调味器装饰

image-20210807122417046

Mocha.java

/**
 * @author BNTang
 * @program design-pattern-pro
 * @date Created in 2021/10/12 012 11:53
 * @description
 **/
public class Mocha extends CondimentDecorator {
    public Mocha(Beverage beverage) {
        super(beverage, 5, "抹茶");
    }

    @Override
    public float cost() {
        return getPrice() + getBeverage().cost();
    }

    @Override
    public String getDesc() {
        return super.getDesc() + getBeverage().getDesc();
    }
}

Milk.java

/**
 * @author BNTang
 * @program design-pattern-pro
 * @date Created in 2021/10/12 012 11:42
 * @description
 **/
public class Milk extends CondimentDecorator {
    public Milk(Beverage beverage) {
        super(beverage, 5, "牛奶");
    }

    @Override
    public float cost() {
        return getPrice() + getBeverage().cost();
    }

    @Override
    public String getDesc() {
        return super.getDesc() + getBeverage().getDesc();
    }
}

CondimentDecorator.java

/**
 * @author BNTang
 * @program design-pattern-pro
 * @date Created in 2021/10/12 012 11:39
 * @description
 **/
@EqualsAndHashCode(callSuper = true)
@Data
public abstract class CondimentDecorator extends Beverage {
    private Beverage beverage;

    public CondimentDecorator(Beverage beverage, float price, String desc) {
        super(price, desc);
        this.beverage = beverage;
    }
}

使用如上所创建的类:

/**
 * @author BNTang
 * @program design-pattern-pro
 * @date Created in 2021/10/12 012 11:54
 * @description
 **/
public class Client {
    public static void main(String[] args) {
        Beverage espresso = new Espresso();
        System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");

        espresso = new Milk(espresso);
        System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");

        espresso = new Mocha(espresso);
        System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");
    }
}

UML 图

image-20210807122014570

image-20210807121733882

image-20210807122501316

image-20210807122519828

源码中应用

敬请期待

posted @ 2021-08-06 11:49  BNTang  阅读(36)  评论(0编辑  收藏  举报