装饰者模式

定义: 在不改变原有对象的基础上,将功能附加到对象上。提供了更有弹性的替代方案。

在学习装饰者模式时,经常使用的一个例子是卖煎饼果子,现在我们就化身小贩来卖煎饼果子。我们规定一个鸡蛋饼 5 元,一个肉饼 7 元,一个煎蛋 1 元,一个烤肠 2 元,一包辣条 1 元。

若我们不使用设计模式编程,我们可能需要定义许多的类,比如:加一个煎蛋的鸡蛋饼,加一个烤肠的鸡蛋饼,加一个煎蛋的肉饼等等。

现在我们可以用装饰者模式解决这个问题:

    1. 定义抽象的饼
    abstract class Pie{
        String desc = "饼的抽象";
        public String getDesc(){
            return desc;
           }
        public abstract double getPrice();
        public String toString(){
               return getDesc()+":"+getPrice();
        }
    }

    2. 定义肉饼
    class MeatPie extends Pie {
        MeatPie(){
            desc = "肉饼";
        }
        public double getPrice(){
            return 7.0;
        }
    }
    
    3. 定义鸡蛋饼
    class EggPie extends Pie{
        public EggPie(){
            desc = "鸡蛋饼";
        }
        public double getPrice(){
            return 5.0;
        }
    }
    
    4. 定义抽象的配料
    abstract class Condiment extends Pie{
        public abstract String getDesc();
    }
    
    5. 定义火腿
    class Ham extends Condiment{
        private Pie pie;
        public Ham(Pie pie){
            this.pie = pie;
        }
        @Override
        public double getPrice() {
            return 2+pie.getPrice();
        }
        @Override
        public String getDesc() {
            return pie.getDesc()+"+火腿";
        }
    }
    
    6.定义煎蛋
    class FireEgg extends Condiment{
        private Pie pie;
        public FireEgg(Pie pie){
            this.pie = pie;
        }
        @Override
        public double getPrice() {
            return 1+pie.getPrice();
        }
        @Override
        public String getDesc() {
            return pie.getDesc()+"+煎蛋";
        }
    }
    
    7. 测试
    Pie pie = new MeatPie();
    System.out.println(pie);
    
    pie = new FireEgg(pie);
    System.out.println(pie);
    
    pie = new Ham(pie);
    System.out.println(pie);

 

总结:
我们可以看出,装饰者模式包含:1. 抽象的组件 2. 具体的组件/抽象的装饰者 3. 具体的装饰者

 

 

thanks:

https://www.jianshu.com/p/4a530a3c70af

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值