三分钟看懂装饰者模式
1.描述食物Food.
注意desc的权限修饰是protected,为了子类能继承。
public abstract class Food {
private String desc;
public abstract String getDesc();
}
2.具体的食物鸡肉,鸭肉
public class Chicken extends Food{
public Chicken(){
desc="鸡肉";
}
@Override
public String getDesc() {
return desc;
}
}
/**
* 鸭肉
* @author xinye
*
*/
public class Duck extends Food {
public Duck(){
desc = "鸭肉";
}
@Override
public String getDesc() {
return desc;
}
}
3.怎么吃肉,做个描述,可以先煮后烤。是二重修饰,先写修饰的基类,然后传入food修饰
public abstract class DeocateFood extends Food{
@Override
public abstract String getDesc();
}
public class SteamedFood extends DeocateFood {
private Food food;
public SteamedFood(Food f) {
this.food = f;
}
@Override
public String getDesc() {
return getDecoration() + food.getDesc();
}
private String getDecoration() {
return "蒸";
}
}
public class RoastFood extends DeocateFood {
private Food food;
public RoastFood(Food f){
this.food = f;
}
@Override
public String getDesc() {
return getDecoration() + food.getDesc();
}
private String getDecoration(){
return "烤";
}
}
4.测试,
public class DeocationTest {
public static void main(String[] args) {
// 测试单纯的食物
Food f1 = new Chicken();
System.out.println(f1.getDesc());
System.out.println("----------------------");
// 测试单重修饰的食物
RoastFood rf = new RoastFood(f1);
System.out.println(rf.getDesc());
System.out.println("----------------------");
// 测试多重修饰的食物
SteamedFood sf = new SteamedFood(rf);
System.out.println(sf.getDesc());
}
}
结果: