一头扎进设计模式-装饰者模式

定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

用自己的话说:装饰者与被装饰者实现同一个接口,把被装饰者当为参数传递到装饰者中,由装饰者进行粉饰调用,用户面向装饰者

代码:
定义一个抽象饮料类

public abstract class Beverage {
    //抽象饮料类
    String description = "Unkonwn Beverage";
    public String getDescription(){
        return description;
    }
    public abstract double cost();
}

定义一个饮料:

/**
 * 浓缩咖啡饮料
 * @author jiangjintai
 *
 */
public class Espresso extends Beverage {
    /**
     * 
     */
    public Espresso() {
        // TODO 自动生成的构造函数存根
        this.description="浓缩咖啡";
    }
    /* (非 Javadoc)
     * @see com.jjt.decorative.Beverage#cost()
     */
    @Override
    public double cost() {
        // TODO 自动生成的方法存根
        return 1.99;
    }
}

定义一个装饰者抽象类:

//这是一个装饰者类,继承饮料类不是因为要继承他的方法是要实现他的类型
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}

定义一个装饰者:

public class Mocha extends CondimentDecorator {
    Beverage beverage;
    /**
     * 
     */
    public Mocha(Beverage beverage) {
        // TODO 自动生成的构造函数存根
        this.beverage=beverage;
    }
    /* (非 Javadoc)
     * @see com.jjt.decorative.CondimentDecorator#getDescription()
     */
    @Override
    public String getDescription() {
        // TODO 自动生成的方法存根
        return beverage.getDescription()+",Mocha";
    }

    /* (非 Javadoc)
     * @see com.jjt.decorative.Beverage#cost()
     */
    @Override
    public double cost() {
        // TODO 自动生成的方法存根
        return .20+beverage.cost();
    }
}

测试:

public static void main(String[] args){
        Beverage espresso = new Espresso();
        System.out.println(espresso.getDescription()+":"+espresso.cost()+"元");
        Beverage addMoca = new Mocha(espresso);
        Beverage addMoca2 = new Mocha(addMoca);
        Beverage addMoca3 = new Mocha(addMoca2);
        System.out.println(addMoca3.getDescription()+":"+addMoca3.cost()+"元");

        HouseBlend houseBlend = new HouseBlend();//这里是我写的另一种饮料
        System.out.println(houseBlend.getDescription()+":"+houseBlend.cost()+"元");
        Beverage addMoca4 = new Mocha(houseBlend);
        Beverage addMoca5 = new Mocha(addMoca4);
        System.out.println(addMoca5.getDescription()+":"+addMoca5.cost()+"元");
    }

结果:

浓缩咖啡:1.99元
浓缩咖啡,Mocha,Mocha,Mocha:2.5900000000000003元
好冰咖啡:0.89元
好冰咖啡,Mocha,Mocha:1.29
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值