23种设计模式(五)装饰者模式

装饰者模式

扩展原有对象的功能:
我买个房子(对象),我装修(不在原有的对象上进行操作),就是装饰者,动态添加,动态撤销
接下来我用代码举例子:
早晨我要买早餐,买的煎饼(对象),(装饰者)我有点饿加一个鸡蛋,再加一个香肠,在加一包辣条,我感觉吃不饱,我又加了一个鸡蛋
在原有的基础上进行扩展
抽象煎饼类煎饼的描述,价格

public abstract class ABattercake {
    protected abstract String getDesc();
    protected abstract int cost();
}

定义抽象煎饼装饰者,继承自抽象煎饼

public abstract class AbstractDecorator extends ABattercake {
    private ABattercake aBattercake;//将抽象煎饼类

    public AbstractDecorator(ABattercake aBattercake) {
        this.aBattercake = aBattercake;
    }

    protected abstract void doSomething();

    @Override
    protected String getDesc() {
        return this.aBattercake.getDesc();
    }

    @Override
    protected int cost() {
        return this.aBattercake.cost();
    }
}

煎饼类

public class Battercake extends ABattercake {
    @Override
    protected String getDesc() {
        return "煎饼";
    }

    @Override
    protected int cost() {
        return 8;
    }
}

鸡蛋装饰者类

public class EggDecorator extends AbstractDecorator {
    public EggDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    protected void doSomething() {

    }

    @Override
    protected String getDesc() {
        return super.getDesc()+" 加一个鸡蛋";
    }

    @Override
    protected int cost() {
        return super.cost()+1;
    }
}

香肠类

public class SausageDecorator extends AbstractDecorator{
    public SausageDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    protected void doSomething() {

    }

    @Override
    protected String getDesc() {
        return super.getDesc()+" 加一根香肠";
    }

    @Override
    protected int cost() {
        return super.cost()+2;
    }
}

运行:

  ABattercake aBattercake;
        aBattercake = new Battercake();
        aBattercake = new EggDecorator(aBattercake);
        aBattercake = new EggDecorator(aBattercake);
        aBattercake = new SausageDecorator(aBattercake);

        System.out.println(aBattercake.getDesc()+" 销售价格:"+aBattercake.cost());

运行结果:

煎饼 加一个鸡蛋 加一个鸡蛋 加一根香肠 销售价格:12

由上看出装饰者的存在 jdk源码中FileInputStream,OutPutStream,都是装饰者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值