设计模式真香笔记-装饰者模式

装饰者模式的介绍

装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
实际中的装饰者模式的例子:比如 java.io包的实现

装配者模式通用的UML类图

在这里插入图片描述

利用到的新原则

  • 类应该对扩展开放,对修改关闭

饮料和配料的例子

例子里面cost()的图形理解
在这里插入图片描述

  • Beverage(抽象抽象的组件类)
public abstract class Beverage {
    String description = "Unknown description";

    public String getDescription() {
        return description;
    }
    public abstract double cost();
}
  • CondimentDecorator(调料共同实现的接口 抽象类)
public abstract class CondimentDecorator extends Beverage {//调料抽象类
        @Override
        public abstract String getDescription();
}
  • Espresso(具体饮料类 被装饰者继承Beverage抽象类)
public class Espresso extends  Beverage {

    public Espresso(){
        description = "beverage.Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
      }

  • HouseBlend (具体饮料类 被装饰者继承Beverage抽象类)
public class HouseBlend extends Beverage {
        public HouseBlend(){
            description = "House Blend Coffee";
        }
    @Override
    public double cost() {
        return 0.89;
    }
}
  • DarkRoast (具体饮料类 被装饰者继承Beverage抽象类)
public class DarkRoast extends Beverage {

        public DarkRoast(){
            description = "beverage.DarkRoast Coffee";
        }
    @Override
    public double cost() {
        return 0.99;
    }
}
  • Mocha(具体调味类 装饰者继承CondimentDecorator装饰者抽象类)
public class Mocha extends CondimentDecorator {//具体装饰者
     Beverage beverage;
     public Mocha(Beverage beverage){
         this.beverage = beverage;
     }
    @Override
    public String getDescription() {
        return beverage.getDescription()+",beverage.Mocha";
    }

    @Override
    public double cost() {
        return 0.2+beverage.cost();
    }
}
  • Soy(具体调味类 装饰者继承CondimentDecorator装饰者抽象类)
public class Soy extends CondimentDecorator {
    Beverage beverage;
    public Soy(Beverage beverage){
        this.beverage = beverage;
    }
    @Override
    public String getDescription() {
        return beverage.getDescription()+",beverage.Soy";
    }

    @Override
    public double cost() {
        return 0.14+beverage.cost();
    }
}
  • Providecoffee测试类(具体如何通过装饰者模式实现饮料的配料添加和价格的计算)
public class Providecoffee {//测试类

    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription()+"   "+beverage.cost()+"¥");

        Beverage darkRoast = new DarkRoast();//制造出一个饮料对象
        darkRoast = new Mocha(darkRoast);//用mocha调料装饰饮料对象
        darkRoast = new Mocha(darkRoast);//再用mocha调料装饰饮料的对象
        darkRoast = new Soy(darkRoast);//最后再用soy调料装饰饮料的对象
        System.out.println(darkRoast.getDescription()+"   "+darkRoast.cost()+"¥");//暗含者递归的思想打印饮料的添加和价格

    }
}

装饰者模式的总结

  • 继承是一种扩展形式,但不是一定是最佳的方案。
  • 装饰者模式可以进行扩展
  • 装饰者模式意味着一群装饰者包装具体的组件
  • 装饰者会导致设计中出现许多小对象,太多了的话会让程序变得很复杂。

本文参考 :《Head First 设计模式》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值