装饰者设计模式,对于一个抽象的类,对其添加自己想要的各种类修饰它。
代码特点:一边继承,一边又关联。意味着可以重写你,又可以拿到你所有的属性。 当然就可以装饰了。
abstract class Condiment extends Beverage { protected Beverage beverage;
@Data
abstract class Beverage {
private String description;
public Beverage (String description) {
this.description = description;
}
public abstract double cost();
}
abstract class Condiment extends Beverage {
protected Beverage beverage;
public Condiment (Beverage beverage) {
super("调料");
this.beverage = beverage;
}
}
class Milk extends Condiment {
public Milk(Beverage beverage) {
super(beverage);
}
@Override
public double cost() {
return beverage.cost() + 5;
}
@Override
public String getDescription() {
return beverage.getDescription()+ "牛奶";
}
}
class Mocha extends Condiment {
public Mocha(Beverage beverage) {
super(beverage);
}
@Override
public double cost() {
return beverage.cost() + 100;
}
@Override
public String getDescription() {
return beverage.getDescription()+ "摩卡";
}
}
class Decaf extends Beverage {
public Decaf() {
super("无糖咖啡");
}
@Override
public double cost() {
return 1;
}
}
class Espresso extends Beverage {
public Espresso() {
super("意式浓缩");
}
@Override
public double cost() {
return 10;
}
}
//装饰者设计模式
public class Decorator {
public static void main (String[] args) {
Beverage beverage = new Decaf();
System.out.println(beverage.getDescription() + beverage.cost());
Milk milk = new Milk(beverage);
System.out.println(milk.getDescription() + milk.cost());
Mocha mocha = new Mocha(milk);
System.out.println(mocha.getDescription() + mocha.cost());
System.out.println("***********************");
Beverage beverage1 = new Decaf();
Beverage b1 = new Milk(beverage1);
Beverage b2 = new Mocha(beverage1);
System.out.println(b2.getDescription() + b2.cost());
}
}
输出结果
无糖咖啡1.0
无糖咖啡牛奶6.0
无糖咖啡牛奶摩卡106.0
***********************
无糖咖啡摩卡101.0