装饰器模式2

  1. 抽象角色component,定义一组公共接口
/**
 * 定义顶层喝奶茶的接口
 * @author 10191192
 * @date 2019/9/10
 */
public interface DrinkMilkTea {

	float getTotalPrice();

	String useMaterial();
}
  1. 具体的构建角色,被装饰者类
/**
 * 焦糖奶茶类,实现顶层的接口,本质就是核心组件
 * @author 10191192
 * @date 2019/9/10
 */
public class CaramelMilkTea implements DrinkMilkTea {

	@Override
	public float getTotalPrice() {
		return 12;
	}

	@Override
	public String useMaterial() {
		return "焦糖奶茶";
	}
}
  1. Decorator装饰角色,扩展 抽象角色component的功能,持有componet的角色
/**
 * 奶茶具体材料不清楚,定义一个抽象的装饰器,让子类去设计实现什么样的装饰材料
 * 但是单独定义没有意义,需要将材料放在奶茶中才能体现价值
 * 因此需要实现顶层的奶茶接口,并持有奶茶实例进行相关操作
 * @author 10191192
 * @date 2019/9/10
 */
public abstract class MilkTeaMaterialDecorator implements DrinkMilkTea {

	protected DrinkMilkTea drinkMilkTea;

	public MilkTeaMaterialDecorator(DrinkMilkTea drinkMilkTea) {
		this.drinkMilkTea = drinkMilkTea;
	}

	@Override
	public float getTotalPrice() {
		return drinkMilkTea.getTotalPrice();
	}

	@Override
	public String useMaterial() {
		return drinkMilkTea.useMaterial();
	}
}
  1. 具体的装饰角色,实现具体的扩展的componet的功能
/**
 * 布丁装饰器类,负责布往奶茶中加入布丁材料
 * @author 10191192
 * @date 2019/9/10
 */
public class PuddingMaterialDecorator extends MilkTeaMaterialDecorator {

	public PuddingMaterialDecorator(DrinkMilkTea drinkMilkTea) {
		super(drinkMilkTea);
	}

	@Override
	public float getTotalPrice() {
		return super.getTotalPrice() + 2;
	}

	@Override
	public String useMaterial() {
		return super.useMaterial() + ",添加 : 布丁.";
	}
}
/**
 * 青稞装饰器类,负责往奶茶中加入青稞材料
 * @author 10191192
 * @date 2019/9/10
 */
public class HighlandBarleyMaterialDecorator extends MilkTeaMaterialDecorator {

	public HighlandBarleyMaterialDecorator(DrinkMilkTea drinkMilkTea) {
		super(drinkMilkTea);
	}

	@Override
	public float getTotalPrice() {
		return super.getTotalPrice() + 3;
	}

	@Override
	public String useMaterial() {
		return super.useMaterial() + ",添加 : 青稞.";
	}
}
  1. 具体使用
public class TestDemo {

	public static void main(String[] args) {

		// 实例化一个焦糖奶茶
		DrinkMilkTea milkTea = new CaramelMilkTea();
		System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());

		//添加布丁
		milkTea = new PuddingMaterialDecorator(milkTea);
		System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());

		// 添加青稞
		milkTea = new HighlandBarleyMaterialDecorator(milkTea);
		System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());

		// 添加第二份青稞
		milkTea = new HighlandBarleyMaterialDecorator(milkTea);
		System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());

	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值