有抽象类名为早餐,现在具体的食物只需继承早餐抽象类,就可以作为早餐。
具体构件类,如只有breakfast抽象类和Hamburger类,满足需求。
如果需求改变,hamburger需要加料,又不能或不想改变Hamburger类,那么需要用装饰者模式,添加抽象装饰类和具体装饰类。
早餐类:
public abstract class Breakfast {
public String description = "undefined";
public String getDescription() {
return description;
}
public abstract double cost();
}
汉堡类:
public class Hamburger extends Breakfast{
public Hamburger() {
description = "Hamburger";
}
@Override
public double cost() {
return 15;
}
}
抽象装饰类:
public abstract class CondimentDecorator extends Breakfast{
Breakfast myfood;
public CondimentDecorator(Breakfast f) {
this.myfood = f;
}
public String getDescription() {
//return super.getDescription();//多态中父类引用指向子类对象,调用某方法时看子类有无重写,有重写可调用。
return myfood.getDescription();//返回子类中重写的getDescription方法
}
public double cost() {
return myfood.cost();//调用子类中重写的cost方法
}
}
具体装饰类:
/**
* 具体装饰类,继承抽象装饰类,重写方法
* 需要扩展一个类的功能或给一个类添加附加职责,动态给一个对象添加功能,这些功能能动态撤销
* @author Administrator
*
*/
//加火腿
public class Ham extends CondimentDecorator{
public Ham(Breakfast f) {
super(f);//父类的构造函数
}
public double cost() {
return super.cost() + 5;//
}
public String getDescription() {
return super.getDescription() + ",火腿 ";
}
}
测试
public static void main(String[] args) {
Breakfast hamburger = new Hamburger();//点了一个汉堡
System.out.println(hamburger.getDescription() + " " + hamburger.cost());
//加料
Breakfast hamplus = new Ham(hamburger);
System.out.println(hamplus.getDescription() + " " + hamplus.cost());
}
结果:
Hamburger 15.0
Hamburger,火腿 20.0