package DecoratorMethod; /*优点: 可以实现不同要素类之间的排列组合 缺点: 要素类可以随机组合,容易获取违反业务逻辑的组合
扩展: 继承可以对某个方法进行功能增强,装饰设计模式也可以对某个方法进行功能增强,另外: 二者可以结合使用*/ /*需求: 黑咖啡 加奶的黑咖啡 加糖的黑咖啡 加冰的黑咖啡 加奶加糖的黑咖啡 加奶加冰的黑咖啡 加冰加糖的黑咖啡 加奶加糖加冰的黑咖啡
功能: 煮 喝 根据上述事务,设计一个类体系结构*/public class Demo2 { public static void main(String[] args) { // 1.现在来实现一个功能,比如加糖加冰的黑咖啡 Coffee c = new BlackCoffee(); Coffee sc = new SugerCoffee(c); Coffee ic = new IceCoffee(sc); ic.zhu(); ic.drink(); // 2.现在要继续实现扩充功能,比如说加糖加倍 System.out.println(“—————————-“); Coffee c1 = new BlackCoffee(); Coffee dsc = new DoubleSugerCoffee(c1); Coffee ic1 = new IceCoffee(dsc); ic1.zhu(); ic1.drink(); }
}
// 抽取出一个接口,具有煮和喝的两个功能 interface Coffee { void zhu();
void drink();}
// 定义一个黑咖啡类,实现了Coffee,上述功能都需要最终搞这个黑咖啡 class BlackCoffee implements Coffee {
@Override public void zhu() { System.out.println("煮咖啡"); } @Override public void drink() { System.out.println("喝黑咖啡"); }}
// 以下的类均实现了Coffee类,都是添加了不同要素类 class SugerCoffee implements Coffee { private Coffee coffee;
public SugerCoffee(Coffee coffee) { this.coffee = coffee; } @Override public void zhu() { coffee.zhu(); } @Override public void drink() { System.out.println("加糖"); coffee.drink(); }}
class MilkCoffee implements Coffee { private Coffee coffee;
public MilkCoffee(Coffee coffee) { this.coffee = coffee; } @Override public void zhu() { coffee.zhu(); } @Override public void drink() { System.out.println("加奶"); coffee.drink(); }}
class IceCoffee implements Coffee { private Coffee coffee;
public IceCoffee(Coffee coffee) { this.coffee = coffee; } @Override public void zhu() { coffee.zhu(); } @Override public void drink() { System.out.println("加冰"); coffee.drink(); }}
// 下边是通过继承的方式来实现对加糖方法的扩充 class DoubleSugerCoffee extends SugerCoffee {
public DoubleSugerCoffee(Coffee coffee) { super(coffee); } @Override public void drink() { System.out.println("两包!"); super.drink(); }}