装饰设计模式强调的是增强效果(对一个类的某些功能进行增强)。
装饰类
package MONA.demo13_装饰设计模式;
/**
* 喝咖啡
* 咖啡:拿铁 摩卡
* 加调料: 牛奶 巧克力
*
* 装饰设计模式
*/
public class Demo01 {
public static void main(String[] args) throws Exception {
MochaCoffee mochaCoffee = new MochaCoffee();
System.out.println("咖啡名称:"+mochaCoffee.getName()+" 咖啡价格:"+mochaCoffee.getPrice());
//需求:在不改变MochaCoffee类的情况下,添加新的功能
//加了牛奶的摩卡
Milk milk = new Milk(mochaCoffee);
System.out.println("咖啡名称:"+milk.getName()+" 咖啡价格:"+milk.getPrice());
//加了巧克力的摩卡
Chocolate chocolate = new Chocolate(mochaCoffee);
System.out.println("咖啡名称:"+chocolate.getName()+" 咖啡价格:"+chocolate.getCost());
}
}
巧克力类
package MONA.demo13_装饰设计模式;
/**
* 巧克力
*/
public class Chocolate {
private Coffee coffee;
private int cost = 10;
public Chocolate(Coffee coffee){
this.coffee = coffee;
}
double getCost(){
return cost +coffee.getPrice();
}
public String getName(){
return "加了巧克力的"+coffee.getName();
}
}
牛奶类
package MONA.demo13_装饰设计模式;
/**
* 牛奶类
*/
public class Milk {
//持有咖啡对象
Coffee coffee;
//额外收费
int cost = 10;
public Milk(Coffee coffee){
this.coffee = coffee;
}
//获取价格
double getPrice(){
return cost + coffee.getPrice();
}
public String getName(){
return "加了牛奶的"+coffee.getName();
}
}
咖啡的父类
package MONA.demo13_装饰设计模式;
/**
* 咖啡的父类
*/
public class Coffee {
//价格
protected double price;
//名称
protected String name;
public Coffee(String name) {
this.name = name;
}
//获取价格
public double getPrice() {
return price;
}
//获取名称
public String getName() {
return name;
}
}
摩卡咖啡子类
package MONA.demo13_装饰设计模式;
/**
* 摩卡咖啡子类
*/
public class MochaCoffee extends Coffee{
public MochaCoffee() {
super("摩卡");
}
@Override
public double getPrice() {
return 28;
}
}