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();
}
}