设计模式-装饰者模式

96 阅读2分钟

基本概念

装饰者模式是一种结构型设计模式,它允许在不改变对象自身的基础上,动态地给一个对象添加额外的功能。

主要组成

  • 抽象组件(Drinks):定义一个对象的接口,可以给这些对象动态地添加职责。
  • 具体组件(Coffee):实现抽象组件的接口,代表被装饰的原始对象。
  • 抽象装饰者(Decorator):继承或实现抽象组件,持有一个抽象组件的引用,可以调用被装饰对象的方法,并且可以在其前后增加新的功能。
  • 具体装饰者(DecoratorSugar):实现抽象装饰者的方法,给被装饰对象增加具体的职责。

uml图

20886b4156e8d43802ef3b78f6135ff.png

代码

  • Drinks【抽象组件】
package decorator;

/**
 * @ClassName Drinks
 * @Description: 饮料抽象类【抽象组件】
 * @Author: wu
 * @CreateDate: 2024/3/21 10:41
 */
public abstract class Drinks {

    /**
     * 饮料描述
     * @return
     */
    public abstract String getDesc();

    /**
     * 饮料价钱
     * @return
     */
    public abstract double cost();
}
  • Coffee【具体组件】
package decorator;

/**
 * @ClassName Coffee
 * @Description: 被修饰对象-咖啡【具体组件】
 * @Author: wu
 * @CreateDate: 2024/3/21 10:39
 */
public class Coffee extends Drinks{
    /**
     * 饮料描述
     *
     * @return
     */
    @Override
    public String getDesc() {
        return "咖啡";
    }

    /**
     * 饮料价钱
     *
     * @return
     */
    @Override
    public double cost() {
        return 10;
    }
}
  • Decorator【抽象装饰者】
package decorator;

/**
 * @ClassName Decorator
 * @Description: 抽象装饰类
 * @Author: wu
 * @CreateDate: 2024/3/21 10:45
 */
public abstract class Decorator extends Drinks{

    Drinks drinks;

    public Decorator(Drinks drinks){
        this.drinks = drinks;
    }
}
  • DecoratorSugar【具体装饰者】
package decorator;

/**
 * @ClassName DecoratorSugar
 * @Description: 对饮料装饰+糖【具体装饰类】
 * @Author: wu
 * @CreateDate: 2024/3/21 10:47
 */
public class DecoratorSugar extends Decorator{
    public DecoratorSugar(Drinks drinks) {
        super(drinks);
    }

    /**
     * 饮料描述
     *
     * @return
     */
    @Override
    public String getDesc() {
        return drinks.getDesc()+"加糖";
    }

    /**
     * 饮料价钱
     *
     * @return
     */
    @Override
    public double cost() {
        return drinks.cost()+1;
    }
}
  • DecoratorMilk【具体装饰者】
package decorator;

/**
 * @ClassName DecoratorSugar
 * @Description: 对饮料装饰+奶 【具体装饰类】
 * @Author: wu
 * @CreateDate: 2024/3/21 10:47
 */
public class DecoratorMilk extends Decorator{
    public DecoratorMilk(Drinks drinks) {
        super(drinks);
    }

    /**
     * 饮料描述
     *
     * @return
     */
    @Override
    public String getDesc() {
        return drinks.getDesc()+"加奶";
    }

    /**
     * 饮料价钱
     *
     * @return
     */
    @Override
    public double cost() {
        return drinks.cost()+2;
    }
}
  • Test【测试类】
package decorator;

/**
 * @ClassName Test
 * @Description: 类描述
 * @Author: wu
 * @CreateDate: 2024/3/21 10:50
 */
public class Test {

    public static void main(String[] args) {
        Drinks drinks = new Coffee();
        drinks = new DecoratorSugar(drinks);
        drinks = new DecoratorMilk(drinks);
        System.out.println(drinks.getDesc()+"="+drinks.cost());
    }
}