这是定义六边形架构模式的原始文章中包含的示例代码应用程序的一个版本。
该应用程序有一个驱动端口,带有提供的“折扣”接口,它计算从给定金额中减去的折扣(我们将假设欧元为货币)。将为此端口实施两个驱动程序:
- 测试用例。
- 供人类用户使用的 CLI(命令行界面)。
折扣是根据以下公式对金额应用费率计算得出的:
discount(amount) = amount * rate(amount)
申请费率取决于金额,如下所述:
- 可能数量值的整个范围被分成不重叠的、连续的区间。具体的速率值与每个间隔相关联。
- 应用于金额的汇率将是与金额所属的区间关联的汇率值。
- 这样的间隔是通过定义所谓的Breaking Points来创建的。断点是一个具体的量值,它是两个连续区间之间的边缘。这是汇率值变化的点。
- 因此,间隔及其速率可以以汇总方式定义,表格中的每一行都是一个(断点,速率值)对,按增加的断点值排序。
费率表:
- 对于介于 0 欧元和 99.99 欧元(包括两者)之间的任何金额,费率将为 0%
- 对于 100 欧元至 999.99 欧元(包括两者)之间的任何金额,税率为 5%
- 对于 1,000 欧元至 9,999.99 欧元(包括两者)之间的任何金额,税率为 7%
- 对于任何大于或等于 10,000 欧元的金额,税率为 10%
该应用程序知道 "断点 "和 "费率 "的概念。它也知道应用逻辑来计算一个金额的费率,给定一个包含断点和费率的表格。应用程序不知道(也不必知道)的是,该表来自哪里(一个文件、一个数据库、一个远程服务、一个内存数据结构......)。
该应用程序有一个驱动端口,具有 "用于获取速率 "的必要接口,它返回一个迭代器,从最后一行开始,逐一获取表的行数。这个端口的两个适配器将被实现。
- 一个测试用的双重(stub),返回一个带有硬编码值的内存速率表的迭代器。
- 一个真正的适配器,为文件中的速率表获取一个迭代器。
包结构
源代码被分割成3个包:
- Application:这是 "六边形",是业务逻辑。它包括作为Java接口的端口,是应用程序的API。实现细节应该被隐藏。
- Outside: 这里是适配器和角色的位置。它们被按端口分组。
- Startup:这是运行应用程序的入口点。在这里,我们有一个配置器,用于将应用程序的不同部分连接起来。它使用Spring Boot框架。
依赖项是:
- “Startup”依赖于“Outside”和“Application”。
- “Outside”取决于“Application”。
- “Application”不依赖于任何。
编程环境:
- Java 1.8
- Spring Boot 2.7.6
- Maven 3.8.6
- IDE: IntelliJ IDEA 2021.3.3 (Community Edition)
- Ubuntu 20.04.5 LTS
编译和运行应用程序:
1、下载 GitHub 存储库https://github.com/jmgarridopaz/discounter
2、转到下载它的目录
3、运行 maven 以编译、打包并将工件安装到本地 Maven 存储库中:
mvn clean install -U
4、使用两个参数运行生成的“jar”文件:
- 用于运行应用程序的适配器组合:(默认情况下,“test”)
--config.option = [ test | cli-none | cli-test | cli-file ]
- 当“config.option = cli-file”时,此参数为带有费率表的文本文件的名称:(默认为当前目录下的“rates.txt”)
--rates.file.name = /path/to/a/text/file
例如,对于运行“cli”驱动适配器和测试双重作为驱动适配器:
java -jar ./discounter-startup/target/discounter-startup-1.0.0.jar --config.option=cli-test |
项目点击标题