本文为笔者学习《Head First设计模式》的笔记,并加入笔者自己的理解和归纳总结
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
结构图
鸡尾酒Cocktail
一般以伏特加(Vodka
)、威士忌(Whisky
)等烈酒或是葡萄酒作为基酒,再配以柠檬汁(LemonJuice
)、石榴汁(PomegranateJuice
)、蒸馏水(DistilledWater
)、冰块(IceBlock
)等其他辅助材料,加以搅拌或摇晃而成的一种饮料。
public interface Cocktail {
String getDescription();
}
public class Vodka implements Cocktail {
@Override
public String getDescription() {
return "Vodka";
}
}
public class Whisky implements Cocktail {
@Override
public String getDescription() {
return "Whisky";
}
}
抽象装饰类(CocktailDecorate
)
public abstract class CocktailDecorate implements Cocktail {
Cocktail cocktail;
public CocktailDecorate(Cocktail cocktail) {
this.cocktail = cocktail;
}
@Override
public String getDescription() {
return cocktail.getDescription();
}
}
具体装饰类
public class LemonJuice extends CocktailDecorate {
public LemonJuice(Cocktail decorate) {
super(decorate);
}
@Override
public String getDescription() {
return super.getDescription() + ", Lemon Juice";
}
}
public class PomegranateJuice extends CocktailDecorate {
public PomegranateJuice(Cocktail decorate) {
super(decorate);
}
@Override
public String getDescription() {
return super.getDescription() + ", Pomegranate Juice";
}
}
public class DistilledWater extends CocktailDecorate {
public DistilledWater(Cocktail decorate) {
super(decorate);
}
@Override
public String getDescription() {
return super.getDescription() + ", Distilled Water";
}
}
public class IceBlock extends CocktailDecorate {
public IceBlock(Cocktail decorate) {
super(decorate);
}
@Override
public String getDescription() {
return super.getDescription() + ", Ice Block";
}
}
运行
public static void main(String[] args) {
Cocktail cocktail = new Whisky();
cocktail = new LemonJuice(cocktail);
cocktail = new PomegranateJuice(cocktail);
cocktail = new DistilledWater(cocktail);
System.out.println(cocktail.getDescription());
cocktail = new Vodka();
cocktail = new IceBlock(cocktail);
System.out.println(cocktail.getDescription());
}
输出
相关文章
Java 设计模式