Java 实现装饰器模式

Java 实现装饰器模式示例

Java 实现装饰器模式


下面是一个经典的咖啡加配料案例的装饰器模式实现:

接口 - 定义饮料的抽象

interface Beverage {
    String getDescription();
    double cost();
}

具体的基本饮料

class Espresso implements Beverage {
    @Override
    public String getDescription() {
        return "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}
class HouseBlend implements Beverage {
    @Override
    public String getDescription() {
        return "House Blend Coffee";
    }

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

抽象类 - 所有装饰器的基类

abstract class CondimentDecorator implements Beverage {
    protected Beverage beverage;
    
    public CondimentDecorator(Beverage beverage) {
        this.beverage = beverage;
    }
    
    @Override
    public abstract String getDescription();
}

具体的装饰器类

class Milk extends CondimentDecorator {
    public Milk(Beverage beverage) {
        super(beverage);
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Milk";
    }

    @Override
    public double cost() {
        return beverage.cost() + 0.20;
    }
}
class Mocha extends CondimentDecorator {
    public Mocha(Beverage beverage) {
        super(beverage);
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

    @Override
    public double cost() {
        return beverage.cost() + 0.30;
    }
}

class Soy extends CondimentDecorator {
    public Soy(Beverage beverage) {
        super(beverage);
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Soy";
    }

    @Override
    public double cost() {
        return beverage.cost() + 0.15;
    }
}
class Whip extends CondimentDecorator {
    public Whip(Beverage beverage) {
        super(beverage);
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Whip";
    }

    @Override
    public double cost() {
        return beverage.cost() + 0.10;
    }
}

Client 类 - 使用装饰器模式

public class DecoratorPatternDemo {
    public static void main(String[] args) {
        // 1. 单纯的黑咖啡
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());

        // 2. 加双份摩卡和奶泡的浓缩咖啡
        Beverage beverage2 = new Espresso();
        beverage2 = new Mocha(beverage2);
        beverage2 = new Mocha(beverage2);
        beverage2 = new Whip(beverage2);
        System.out.println(beverage2.getDescription() + " $" + beverage2.cost());

        // 3. 加牛奶、豆浆和奶泡的综合咖啡
        Beverage beverage3 = new HouseBlend();
        beverage3 = new Milk(beverage3);
        beverage3 = new Soy(beverage3);
        beverage3 = new Whip(beverage3);
        System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
    }
}

代码说明

  1. Beverage 接口 (Component)
    • 定义饮料的基本操作:获取描述和计算价格
    • 是所有具体饮料和装饰器的共同接口
  2. Espresso 和 HouseBlend 类 (ConcreteComponent)
    • 实现 Beverage 接口
    • 代表具体的基本饮料类型
  3. CondimentDecorator 抽象类 (Decorator)
    • 实现 Beverage 接口
    • 持有一个 Beverage 对象的引用(被装饰的对象)
    • 是所有具体装饰器的基类
  4. Milk, Mocha, Soy, Whip 类 (ConcreteDecorator)
    • 继承 CondimentDecorator
    • 添加自己的描述和价格
    • 委托被装饰对象完成其他操作
  5. DecoratorPatternDemo 类 (Client)
    • 演示如何使用装饰器模式
    • 创建基本饮料
    • 用装饰器动态添加配料
    • 输出最终饮料的描述和价格

输出示例

运行该程序将输出:

Espresso $1.99
Espresso, Mocha, Mocha, Whip $2.69
House Blend Coffee, Milk, Soy, Whip $1.34

装饰器模式特点

  1. 动态添加功能:可以在运行时动态地添加新的功能
  2. 避免类爆炸:不需要为每种组合创建子类
  3. 保持开放封闭原则:对扩展开放,对修改封闭
  4. 装饰顺序影响结果:装饰器的顺序会影响最终结果

这个示例展示了装饰器模式如何灵活地为对象添加功能,而不需要修改原有代码或创建大量子类。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值