您的位置:首页 > 其它

设计模式——装饰器模式

2017-11-29 18:05 295 查看
个人理解:

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
4000
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", "----------儿童玩偶:变形金刚---------");
}
}


ConcreteDecoratorB:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: