在将这个模式之前。我们先想一个具体的问题,奶茶店的饮料问题,比如:购买一个咖啡只需要这杯咖啡钱,但是在这个咖啡上面加入牛奶和其他作料就必须加上作料的钱,而这里我们就可以将作料封装成装饰者:
package com.gsww.com;
public abstract class Drink {
/**
* 饮料的抽象类
*/
protected String describe;//描述
protected float price;//价格
public String getDescribe() {
return this.describe+":"+this.price;
}
public void setDescribe(String describe) {
this.describe = describe;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public abstract float cost();//消费价格
}
package com.gsww.com;
public class Coffee extends Drink{
/**
* 单品咖啡只返回价格
*/
public float cost(){
return super.getPrice();
}
}
package com.gsww.com;
public class MokaCoffee extends Coffee{
/**
* 咖啡的子类(摩卡咖啡)
*/
public MokaCoffee(){
super.setDescribe("摩卡咖啡");
super.setPrice(3.0f);
}
}
package com.gsww.com;
/**
* 装饰类
* @author luweicheng
*
*/
public class Decorator extends Drink{
protected Drink obj;
public Decorator(Drink obj){//传入被装饰的对象
this.obj = obj;
}
public float cost() {
return obj.cost()+super.getPrice();
}
@Override
public String getDescribe() {
return super.getDescribe()+"&&"+obj.describe+obj.price;
}
}
package com.gsww.com;
public class Milk extends Decorator{
/**
* 装饰着牛奶类
* @param obj
*/
public Milk(Drink obj) {
super(obj);
super.setDescribe("牛奶");
super.setPrice(6.0f);
}
}
测试类:
package com.gsww.com;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
MokaCoffee mokaCoffee = new MokaCoffee();
Milk milk = new Milk(mokaCoffee);
milk.getDescribe();
System.out.println(milk.getDescribe());
}
}
我画了个简单的继承图: