装饰器模式用于给原有对象增加新功能的场景,
拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力。
首先定义一个食物接口:
/**
* 装饰类和被装饰类共同继承的抽象类
* 使装饰类和被装饰类具有一致性
*/
public abstract class Food {
/** 待被装饰者和装饰者具体发挥 */
public abstract String getContent();
/** 对外提供的统一接口 */
public final void taste() {
System.out.println(getContent());
};
}
具体食物类,冰淇淋:
public class IceCream extends Food{
private String name;
public IceCream(String name) {
this.name = name;
}
@Override
public String getContent() {
return name;
}
}
然后定义抽象装饰类:
public abstract class Flavor extends Food{
protected Food food;
protected Flavor(Food food) {
this.food = food;
}
}
具体装饰类,顶部加点料,后续可以定义其他装饰类,扩展方便:
/**
* 装饰类,在被装饰类的基础上添加一点新功能
* 例如给传进来的 food 添加一种新的味道
*/
public class TopFlavor extends Flavor{
/** 独特的口味 */
private String taste;
/** 这里一定要传入被装饰对象 */
public TopFlavor(Food food, String taste) {
super(food);
this.taste = taste;
}
/**
* 在被装饰对象的基础上,加点儿料
* @return
*/
@Override
public String getContent() {
return food.getContent() + " taste " + taste;
}
}
测试代码:
public class Test {
public static void main(String[] args) {
Food iceCream = new IceCream("Cool iceCream");
// 给冰淇淋加点香草味
Flavor flavor = new TopFlavor(iceCream,"vanilla");
flavor.taste();
// 在来点巧克力
Flavor chocolate = new TopFlavor(flavor, "chocolate");
chocolate.taste();
}
}