个人理解:
1. 装饰器模式作用:在已有基本功能的基础之上,动态地添加更多功能的一种方式
2. 扩展对象功能的功能,通过子类继承也可实现,装饰器模式装饰模式可以提供比继承更多的灵活性,而且实现相同功能生成更少的类
3. UML图:
4. 实例代码:
Component:
public interface IMeal { void provideMeals(); void provideLunch(); }
ConcreteComponent:
public class BaseMeal implements IMeal { private String stapleFood; private String snack; public BaseMeal(String stapleFood, String snack) { this.stapleFood = stapleFood; this.snack = snack; } public BaseMeal() { } @Override public void provideMeals() { Log.i("BaseMeal", "----------提供基本套餐:" + stapleFood + "&&" + snack +"---------"); } @Override public void provideLunch() { Log.i("BaseMeal", "----------午餐:汉堡+ 薯条---------"); } }
Decorator:
public class Decorator implements IMeal { private BaseMeal baseMeal; public Decorator(BaseMeal baseMeal) { this.baseMeal = baseMeal; } @Override public void provideMeals() { baseMeal.provideMeals(); } @Override public void provideLunch() { } }
ConcreteDecoratorA:
public class DecoratorChild extends Decorator { private String mealName; private String joyName; public DecoratorChild(BaseMeal baseMeal) { super(baseMeal); } public DecoratorChild(BaseMeal baseMeal, String mealName, String joyName) { super(baseMeal); this.mealName = mealName; this.joyName = joyName; } @Override public void provideMeals() { Log.i("DecoratorChild", "----------提供儿童套餐:" + mealName+ "---------"); super.provideMeals(); Log.i("DecoratorChild", "----------赠送儿童玩偶:" + joyName+ "---------"); } @Override public void provideLunch() { Log.i("DecoratorChild", "----------儿童饮料:哇哈哈---------"); super.provideMeals(); Log.i("DecoratorChild", "----------儿童玩偶:变形金刚---------"); } }
public class DecoratorWork extends Decorator { private String mealName; private int coupon; public DecoratorWork(BaseMeal baseMeal) { super(baseMeal); } public DecoratorWork(BaseMeal baseMeal, String mealName, int coupon) { super(baseMeal); this.mealName = mealName; this.coupon = coupon; } @Override public void provideMeals() { Log.i("DecoratorWork", "----------工作套餐:胡辣汤---------"); super.provideMeals(); Log.i("DecoratorWork", "----------返现:18.5元---------"); } }
客户端调用:
private void factoryDecorator(){ BaseMeal baseMeal = new BaseMeal("汉堡" , "薯条"); Decorator decoratorChild = new DecoratorChild(baseMeal,"牛奶", "喜洋洋"); decoratorChild.provideMeals(); Decorator decoratorWork = new DecoratorWork(baseMeal,"咖啡", 30); decoratorWork.provideMeals(); }
示例代码运行结果:
11-30 10:34:34.275 30306-30306/com.wdp.designtest I/DecoratorChild: ----------提供儿童套餐:牛奶---------
11-30 10:34:34.275 30306-30306/com.wdp.designtest I/BaseMeal: ----------提供基本套餐:汉堡&&薯条---------
11-30 10:34:34.275 30306-30306/com.wdp.designtest I/DecoratorChild: ----------赠送儿童玩偶:喜洋洋---------
11-30 10:34:34.276 30306-30306/com.wdp.designtest I/DecoratorWork: ----------工作套餐:胡辣汤---------
11-30 10:34:34.276 30306-30306/com.wdp.designtest I/BaseMeal: ----------提供基本套餐:汉堡&&薯条---------
11-30 10:34:34.276 30306-30306/com.wdp.designtest I/DecoratorWork: ----------返现:18.5元---------
5. 鸿洋大神的优雅的为RecyclerView添加HeaderView和FooterView使用了装饰器模式:http://blog.csdn.net/lmj623565791/article/details/51854533