装饰者模式:比继承更优雅的处理对象之间的关系。在不改变原有代码的基础上,可动态的给对象赋予更多的职责。
特点
- 比继承更有弹性,更容易扩张
- 装饰者和被装饰者拥有共同的父类
- 符合多用组合、少用继承的设计原则
场景:卖饮料,可以添加糖或奶。卖饮料的代码已存在,不能改动。只能动态的在饮料中添加糖或奶。计算价格。
饮料:可口可乐(5元)、咖啡(10元)
小料:糖(1元)、奶(2元)
设计思路:用装饰者模式,把被装饰者通过构造函数动态的传入装饰者对象中,即包装被装饰者对象。调用被装饰者的价格加上小料的价格即可。
类图
测试类
public class DecoratorTest {
public static void main(String[] args) {
Beverage beverage = new CocaCola();
beverage.display();
Beverage beverage1 = new CocaCola();
beverage1 = new Sugar(beverage1);
beverage1 = new Sugar(beverage1);
System.out.println("加了两份糖:" + beverage1.cost());
Beverage beverage2 = new CocaCola();
beverage2 = new Sugar(beverage2);
beverage2 = new Milk(beverage2);
System.out.println("加了一份糖,一份奶:" + beverage2.cost());
}
}