Design Pattern(4)-Decrator Pattern

装饰者模式,比前面几种design pattern都复杂,一般情况下并不应该用它。它是为了尽量不修改原有类、接口的情况下为其动态添加功能。但是如果允许修改原有类,我觉得还是应该修改原有类,以达到更好的设计。用了装饰者模式,复杂度增加,不便于后续维护,好处是不需要修改现有的接口啊,不需要动其他使用该类的程序。
这里写图片描述
下面以一个麦当劳的例子,去麦当劳点一个果汁juice,你需要动态地实现加冰块、糖甚至其他东西。价格也随之变化,相信大家都做过鸡蛋饼或者武大郎烧饼啥的。麦当劳接口和类是原有的组件,我们不希望修改它。
McDonald接口:

public interface McDonald {
    double orderJuice();
}

ConcreteMcDonald类:

public class ConcreteMcDonald implements McDonald {
    private double price;

    public ConcreteMcDonald(double primaryPrice){
        this.price=primaryPrice;
    }

    @Override
    public double orderJuice() {
        System.out.println("you have ordered a juice");
        return price;
    }

}

Decorator抽象类:

public abstract class Decorator implements McDonald{
    McDonald mcDonald;

    public Decorator(McDonald mcDonald){
        this.mcDonald=mcDonald;
    }
}

IceblocksDecrator类:

public class IceblocksDecrator extends Decorator {
    public IceblocksDecrator(McDonald mcDonald){
        super(mcDonald);
    }
    @Override
    public double orderJuice() {
        double p=mcDonald.orderJuice()+1;
        System.out.println("you have added some ice blocks");
        return p;
    }
}

SugarDecrator类:

public class SugarDecrator extends Decorator {
    public SugarDecrator(McDonald mcDonald){
        super(mcDonald);
    }
    @Override
    public double orderJuice() {
        double p=mcDonald.orderJuice()+3;
        System.out.println("you have added some sugar");
        return p;
    }
}

Client类:

public class Client {
    public static void main(String[] args){
        McDonald mcDonald=new ConcreteMcDonald(10);
        mcDonald=new IceblocksDecrator(mcDonald);
        mcDonald=new SugarDecrator(mcDonald);
        System.out.print(mcDonald.orderJuice());
    }
}

输出:
you have ordered a juice
you have added some ice blocks
you have added some sugar
12.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值