定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
用自己的话说:装饰者与被装饰者实现同一个接口,把被装饰者当为参数传递到装饰者中,由装饰者进行粉饰调用,用户面向装饰者
代码:
定义一个抽象饮料类
public abstract class Beverage {
//抽象饮料类
String description = "Unkonwn Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
定义一个饮料:
/**
* 浓缩咖啡饮料
* @author jiangjintai
*
*/
public class Espresso extends Beverage {
/**
*
*/
public Espresso() {
// TODO 自动生成的构造函数存根
this.description="浓缩咖啡";
}
/* (非 Javadoc)
* @see com.jjt.decorative.Beverage#cost()
*/
@Override
public double cost() {
// TODO 自动生成的方法存根
return 1.99;
}
}
定义一个装饰者抽象类:
//这是一个装饰者类,继承饮料类不是因为要继承他的方法是要实现他的类型
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
定义一个装饰者:
public class Mocha extends CondimentDecorator {
Beverage beverage;
/**
*
*/
public Mocha(Beverage beverage) {
// TODO 自动生成的构造函数存根
this.beverage=beverage;
}
/* (非 Javadoc)
* @see com.jjt.decorative.CondimentDecorator#getDescription()
*/
@Override
public String getDescription() {
// TODO 自动生成的方法存根
return beverage.getDescription()+",Mocha";
}
/* (非 Javadoc)
* @see com.jjt.decorative.Beverage#cost()
*/
@Override
public double cost() {
// TODO 自动生成的方法存根
return .20+beverage.cost();
}
}
测试:
public static void main(String[] args){
Beverage espresso = new Espresso();
System.out.println(espresso.getDescription()+":"+espresso.cost()+"元");
Beverage addMoca = new Mocha(espresso);
Beverage addMoca2 = new Mocha(addMoca);
Beverage addMoca3 = new Mocha(addMoca2);
System.out.println(addMoca3.getDescription()+":"+addMoca3.cost()+"元");
HouseBlend houseBlend = new HouseBlend();//这里是我写的另一种饮料
System.out.println(houseBlend.getDescription()+":"+houseBlend.cost()+"元");
Beverage addMoca4 = new Mocha(houseBlend);
Beverage addMoca5 = new Mocha(addMoca4);
System.out.println(addMoca5.getDescription()+":"+addMoca5.cost()+"元");
}
结果:
浓缩咖啡:1.99元
浓缩咖啡,Mocha,Mocha,Mocha:2.5900000000000003元
好冰咖啡:0.89元
好冰咖啡,Mocha,Mocha:1.29元