Java:设计模式之结构型-装饰者模式(decorator pattern)

装饰者模式(decorator pattern): 动态地将责任附加到对象上

意图:为对象动态添加功能

类图

实现

设计不同种类的饮料,饮料可以添加配料,比如可以添加牛奶,并且支持动态添加新配料。每增加一种配料,该饮料的价格就会增加,要求计算一种饮料的价格。

项目结构

bash 复制代码
$ tree
.
├── Beverage.java                       # 接口
├── Client.java                         # 客户端调用方
└── impl
    ├── CondimentDecorator.java         # 装饰器抽象类
    ├── DarkRoast.java                  # Beverage的实现类
    ├── HouseBlend.java                 # Beverage的实现类
    ├── Milk.java                       # 装饰器抽象类的实现类
    └── Mocha.java                      # 装饰器抽象类的实现类

具体代码

java 复制代码
public interface Beverage {
    double cost();
}
java 复制代码
public class DarkRoast implements Beverage {
    @Override
    public double cost() {
        return 1;
    }
}
java 复制代码
public class HouseBlend implements Beverage {
    @Override
    public double cost() {
        return 1;
    }
}
java 复制代码
public abstract class CondimentDecorator implements Beverage {
    protected Beverage beverage;
}
java 复制代码
public class Milk extends CondimentDecorator {

    public Milk(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public double cost() {
        return 1 + beverage.cost();
    }
}
java 复制代码
public class Mocha extends CondimentDecorator {

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public double cost() {
        return 1 + beverage.cost();
    }
}
java 复制代码
public class Client {
    public static void main(String[] args) {
        Beverage beverage = new HouseBlend();
        beverage = new Mocha(beverage);
        beverage = new Milk(beverage);
        System.out.println(beverage.cost());
        // 3.0
    }
}

参考文章

  1. Java 全栈知识体系:结构型 - 装饰(Decorator)
相关推荐
工业甲酰苯胺18 小时前
实现 json path 来评估函数式解析器的损耗
java·前端·json
老前端的功夫18 小时前
Web应用的永生之术:PWA落地与实践深度指南
java·开发语言·前端·javascript·css·node.js
@forever@18 小时前
【JAVA】LinkedList与链表
java·python·链表
LilySesy18 小时前
ABAP+WHERE字段长度不一致报错解决
java·前端·javascript·bug·sap·abap·alv
六件套是我18 小时前
redission实现延时队列
android·java·servlet
王元_SmallA19 小时前
Redis Desktop Manager(Redis可视化工具)安装
java·后端
ᐇ95919 小时前
Java HashMap深度解析:数据结构、原理与实战指南
java·开发语言·数据结构
好好研究19 小时前
Spring框架 - 开发方式
java·后端·spring
武子康19 小时前
Java-166 Neo4j 安装与最小闭环 | 10 分钟跑通 + 远程访问 Docker neo4j.conf
java·数据库·sql·docker·系统架构·nosql·neo4j
2301_7965125220 小时前
Rust编程学习 - 为什么说Cow 代表的是Copy-On-Write, 即“写时复制技术”,它是一种高效的 资源管理手段
java·学习·rust