设计模式——装饰器模式

个人理解:

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值