Java Decorator

本文介绍了一种在不改变原有类的基础上为其添加新功能的设计模式——装饰者模式,并通过一家虚拟甜品店的例子展示了如何利用该模式简化产品调料的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I. Decorator 作用
在一些情况下,一个类需要加入新的功能,但直接在类上修改不变的情况下可以使用Decorator 设计模式完成。通过传入需要增加功能的类,在decorator 类的方法中对原类进行操作,从而免去了继承的不变。

II. 例子
假设现在有一家甜品店开业,店中产品有donuts和ice cream;而在donuts 、ice cream上可以加入不同的调料。如果采用继承的方式来表示各种加调料的两样产品的话,店中调料每一次更新就需要修改多个类,同时针对同一种调料,两个产品需要两个类来描述。
但使用Decorator 很好地省去了这个麻烦:每一种材料只需要一个类来描述了。

abstract class Desert {
    protected String description;

    public String getDescription() {
        return description;
    }

    public abstract double cost();

}

class Donuts extends Desert {

    public Donuts() {
        description = "donuts";
    }

    @override
    public double cost() {
        return 1.5;
    }

}

class IceCream extends Desert {

    public IceCream() {
        description = "ice cream";
    }

    @override
    public double cost() {
        return 2.1;
    }
}

// 添加酱料
abstract class Material extends Desert {
    protected Desert desert;

    public Material(Desert desert) {
        this.desert = desert;
    }

    public abstract void addSauce(Sauce sauce);
    public abstract String toString();

}

class DonutsWithSauce extends Material {
    public DonusWithSauce(Desert desert) {
        super(desert);
    }

    @override
    public void addSauce(Sauce sauce) {
        desert.getDescription() = desert.getDescription() + sauce.name();
        desert.cost() += sauce.cost();
    }

    @override
    public String toString() {
        return desert.getDescription() + " " + desert.cost();
    }

}

class IceCreamWithSauce extends Material {
    public IceCreamWithSauce(Desert desert) {
        super(desert);
    }

    @override
    public void addSauce(Sauce sauce) {
        desert.getDescription() = desert.getDescription() + " with   "+sauce.name();
        desert.cost() += sauce.cost();
    }

    @override
    public String toString() {
        return desert.getDescription() + " " + desert.cost();
    }
}

abstract class Sauce {
    protected String description;

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

public class Ketchup extends Sauce {

    public Ketchup() {
        description = "ketchup";
    }

    @override
    public double cost() {
        return 0.2;
    }

}


class Client {
    public static void main (String [] args) {
        DonutsWithSauce dws = new DonutsWithSauce(new Donuts());
        dws.addSauce(new Ketchup());
        System.out.println(dos);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值