基本概念
装饰者模式是一种结构型设计模式,它允许在不改变对象自身的基础上,动态地给一个对象添加额外的功能。
主要组成
- 抽象组件(Drinks):定义一个对象的接口,可以给这些对象动态地添加职责。
- 具体组件(Coffee):实现抽象组件的接口,代表被装饰的原始对象。
- 抽象装饰者(Decorator):继承或实现抽象组件,持有一个抽象组件的引用,可以调用被装饰对象的方法,并且可以在其前后增加新的功能。
- 具体装饰者(DecoratorSugar):实现抽象装饰者的方法,给被装饰对象增加具体的职责。
uml图
代码
- 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());
}
}