三分钟看懂装饰者模式

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());
	}

}

结果:
三分钟看懂装饰者模式