【学习笔记】装饰者模式

前言

本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录

需求

我需要一杯咖啡,但是需要加牛奶和白糖,请算出价格
我们可以拆解为咖啡,装饰着牛奶和白糖,例如像下面这样套着

    /**
     * 咖啡+牛奶+白糖
     * 
     * 所谓装饰描述: 即原味咖啡的基础上,装饰: 牛奶 MilkCondiment,再装饰:白糖 SugarCondiment
     */
    private void updateUI() {
        BaseBaverage mCoffee = new Coffee();
        BaseBaverage mMilkCoffee = new MilkCondiment(mCoffee);
        BaseBaverage mSugarMilkCoffee = new SugarCondiment(mMilkCoffee);

        String result = mSugarMilkCoffee.getDiscribtion() + " cost = " + mSugarMilkCoffee.cost();

        tv_info.setText(result);
        Log.d(Contants.TAG, result);
        //运行结果  Coffee + MilkCondiment + SugarCondiment cost = 22
    }

上述不管是咖啡,还是配料牛奶、白糖都是继承同一个基类或超类,来着这样就可以上述进行相互组合了。

装饰者基类

package com.su.decoratormode.domain;

public abstract class BaseBaverage {

    // 便于知悉子类谁谁谁
    public abstract String getDiscribtion();

    // 价格咯
    public abstract int cost();

}

主料咖啡类

package com.su.decoratormode.domain;

public class Coffee extends BaseBaverage {

    private static final int mCost = 15;

    @Override
    public String getDiscribtion() {
        return Coffee.class.getSimpleName();
    }

    @Override
    public int cost() {
        return mCost;
    }

}

配料-牛奶

package com.su.decoratormode.domain;

public class MilkCondiment extends BaseBaverage {

    private int mCost = 5;
    private BaseBaverage mBaseBaverage;

    public MilkCondiment(BaseBaverage mBaseBaverage) {
        this.mBaseBaverage = mBaseBaverage;
    }

    @Override
    public String getDiscribtion() {
        return mBaseBaverage.getDiscribtion() + " + " + MilkCondiment.class.getSimpleName();
    }

    @Override
    public int cost() {
        return mCost + mBaseBaverage.cost();
    }
}

配料-白糖

package com.su.decoratormode.domain;

public class SugarCondiment extends BaseBaverage {

    private int mCost = 2;
    private BaseBaverage mBaseBaverage;

    public SugarCondiment(BaseBaverage mBaseBaverage) {
        this.mBaseBaverage = mBaseBaverage;
    }

    @Override
    public String getDiscribtion() {
        return mBaseBaverage.getDiscribtion() + " + " + SugarCondiment.class.getSimpleName();
    }

    @Override
    public int cost() {
        return mCost + mBaseBaverage.cost();
    }
}

结语

没想到吧,装饰者模式就这么短。但是在 JAVA API中装饰者模式大量被运用到哦。
举个栗子
FileInputStream fis;
BufferedInputStream bis;
LineNumberInputStream lis;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值