java设计模式-装饰者模式

java设计模式-装饰者模式

装饰者模式定义

  1. 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)’
  2. 这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现.

在这里插入图片描述


星巴克咖啡订单项目(咖啡馆〉:
1)咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式
咖啡)、Decaf(无因咖啡)
2)调料:Milk、Soy(豆浆)、Chocolate
3)要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便
4)使用OO的来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖
啡+调料组合。
在这里插入图片描述
这种方式 每一种配料和 咖啡组合 都会增加一个类 这样类会很多会类爆炸

所以使用装饰者模式解决
在这里插入图片描述
总接口

//总接口
public abstract class Drink {
    public String des; //描述
    private float price=0.0f; //价格

    public String getDes() {
        return des;
    }
    public void setDes(String des) {
        this.des = des;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    //计算费用的抽象方法  子类来实现
    public abstract float cost();
}

咖啡类

//咖啡类   把所有咖啡的公共属性抽取出来
public class Coffeee extends Drink{
    @Override
    public float cost() {
        return super.getPrice();
    }
}

具体的意大利咖啡

//具体的意大利咖啡
public class Espresso extends Coffeee{

    public Espresso(){
        setDes("意大利咖啡");
        setPrice(6.0f);
    }
}

装饰者接口

//装饰者
public class Decorator extends Drink{
	//将咖啡组合进来  
    private Drink obj;

    public Decorator(Drink obj){
        this.obj=obj;
    }
    @Override
    public float cost() {
        //配料的价格加上+饮料的价格
        return super.getPrice()+ obj.cost();
    }
    public String getDes(){
        //obj.getDes()输出被装饰者的信息
        //super.getDes()输出配料的信息
        return  super.getDes()+""+obj.getDes();
    }
}

具体的装饰者 继承了调味品 接口拥有调味品所有方法

//具体的Decorator,这里就是具体的调味品
public class Milk extends Decorator{
    
    public Milk(Drink obj) {
        super(obj);
        setDes("牛奶");
        setPrice(2.0f);//调味品的价格
    }
}
//具体的Decorator,这里就是具体的调味品
public class Chocolate extends Decorator{
    
    public Chocolate(Drink obj) {
        super(obj);
        setDes("巧克力");
        setPrice(3.0f);//调味品的价格
    }
}

测试

public static void main(String[] args) {
        //1.点一份LogBlack  加一分牛奶 和一个巧克力
        Drink LogBlack=new LongBlack();
        System.out.println("价格"+LogBlack.cost()+"描述"+LogBlack.getDes());

        //咖啡套一层牛奶
        LogBlack=new Milk(LogBlack);
        System.out.println("价格"+LogBlack.cost()+"描述"+LogBlack.getDes());
        //咖啡+牛奶 在外面套一层巧克力
        LogBlack = new Chocolate(LogBlack);
        System.out.println("价格"+LogBlack.cost()+"描述"+LogBlack.getDes());
    }

结果
在这里插入图片描述

在这里插入图片描述

IO流中使用到了 装饰者模式
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值