0

0

Java 中实现货币类继承体系:通过抽象方法与模板模式避免重复代码

聖光之護

聖光之護

发布时间:2026-03-02 10:26:11

|

339人浏览过

|

来源于php中文网

原创

Java 中实现货币类继承体系:通过抽象方法与模板模式避免重复代码

本文介绍如何在 Java 中设计 Currency 父类及其子类(如 USD、GBP、YEN),复用通用逻辑(如 API 获取持仓),同时让各子类自主提供差异化字段(如 bankAccountId),实现类型安全、可遍历、无冗余的面向对象结构。

本文介绍如何在 java 中设计 `currency` 父类及其子类(如 `usd`、`gbp`、`yen`),复用通用逻辑(如 api 获取持仓),同时让各子类自主提供差异化字段(如 `bankaccountid`),实现类型安全、可遍历、无冗余的面向对象结构。

在面向对象设计中,当多个子类共享相同行为但依赖各自特有状态时,不应将具体字段(如 bankAccountId)上提至父类硬编码,也不应重复实现逻辑。正确的解法是:将共性逻辑封装在父类中,将差异点抽象为受保护的抽象方法或 final 方法委托——即采用「模板方法模式(Template Method Pattern)」。

✅ 正确设计方案:抽象父类 + 子类职责分离

首先,定义抽象基类 Currency,它包含通用的 getHoldings(String apiKey) 方法,但将账户标识等子类专属信息提取为抽象方法:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public abstract class Currency {
    protected final String apiBaseurl = "https://api.example.com"; // 可配置为常量或注入

    // ✅ 抽象方法:由每个子类提供其专属银行账户 ID
    protected abstract String getBankAccountId();

    // ✅ 共用逻辑:所有子类复用同一份 HTTP 调用与解析流程
    public final float getHoldings(String apiKey) {
        try {
            HttpClient httpClient = HttpClient.newHttpClient();

            URI uri = new URIBuilder(apiBaseurl)
                .addParameter("module", "account")
                .addParameter("action", "tokenbalance")
                .addParameter("accountid", getBankAccountId()) // ← 关键:委托给子类实现
                .addParameter("apikey", apiKey)
                .build();

            HttpRequest request = HttpRequest.newBuilder()
                .uri(uri)
                .GET()
                .build();

            HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

            JsonNode rootNode = new ObjectMapper().readTree(response.body());
            return (float) rootNode.path("result").asDouble(); // 更健壮的类型转换

        } catch (Exception e) {
            throw new RuntimeException("Failed to fetch holdings for " + this.getClass().getSimpleName(), e);
        }
    }

    // ✅ 可选:统一定义其他共享属性/行为(如 symbol、name)
    public abstract String getSymbol();
}

? 注意:URIBuilder 并非 JDK 原生类(常见于 Apache HttpClient),若使用标准 java.net.URI,建议改用 java.net.http.HttpClient 配套的 URI.create() + 字符串拼接,或引入 URIBuilder 所在库(如 org.apache.http.client.utils.URIBuilder)。此处保留原风格以聚焦设计逻辑。

接着,子类仅需专注提供差异化字段,无需重写业务逻辑:

Pixlr
Pixlr

Pixlr是一款2008年推出的在线图片编辑和AI图片处理工具,目前已推出AI 图像生成器、AI 生成填充、AI 删除背景、AI 删除对象和 AI 图像扩展等现代 AI 工具。

下载

立即学习Java免费学习笔记(深入)”;

public class USD extends Currency {
    @Override
    protected String getBankAccountId() {
        return "usd_acct_789123";
    }

    @Override
    public String getSymbol() {
        return "USD";
    }
}

public class GBP extends Currency {
    @Override
    protected String getBankAccountId() {
        return "gbp_acct_456789";
    }

    @Override
    public String getSymbol() {
        return "GBP";
    }
}

public class YEN extends Currency {
    @Override
    protected String getBankAccountId() {
        return "yen_acct_135790";
    }

    @Override
    public String getSymbol() {
        return "JPY";
    }
}

✅ 客户端调用:多态遍历,零耦合

现在你可以像最初设想的那样,安全地遍历并统一调用:

Portfolio portfolio = new Portfolio();
String myApiKey = "duivbncvavsuivavcshinseo";

portfolio.setOwnedCurrencies(Arrays.asList(
    new USD(),
    new GBP(),
    new YEN()
));

for (Currency currency : portfolio.getOwnedCurrencies()) {
    System.out.printf("%s holdings: %.2f%n", 
        currency.getSymbol(), 
        currency.getHoldings(myApiKey)
    );
}

输出示例:

USD holdings: 1250.75
GBP holdings: 892.33
JPY holdings: 145600.00

⚠️ 关键注意事项与进阶建议

  • 不要滥用泛型如 Currency:本场景不涉及类型参数化容器或算法,强行泛型反而增加复杂度且无助于解决字段隔离问题。
  • 字段粒度控制:子类中 bankAccountId 等字段应设为 private,仅通过受保护的 getter 向父类暴露,保障封装性。
  • 异常处理必须显式:网络请求易失败,父类中 try-catch 并包装为运行时异常(如 RuntimeException)是合理选择,避免子类被迫处理检查异常。
  • 可扩展性增强:若未来需支持不同 API 协议(如 REST vs GraphQL)、认证方式(Bearer Token vs Query Param),可将 getHoldings() 进一步拆分为 buildRequest() 和 parseResponse() 模板钩子方法。
  • 线程安全提示:HttpClient 是线程安全的,建议在应用层单例复用,而非每次新建;ObjectMapper 同理,应作为静态 final 成员复用。

✅ 总结

真正“可复用”的不是字段,而是逻辑流程;真正“可定制”的不是方法体,而是数据源契约。通过 abstract 方法定义子类必须提供的契约,配合 final 封装通用流程,即可在保持多态调用能力的同时,彻底消除代码重复。这是 Java 继承设计中最经典、最稳健的实践范式之一。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

22

2026.01.21

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

57

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

62

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6488

2023.09.14

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

45

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4万人学习

C# 教程
C# 教程

共94课时 | 10.5万人学习

Java 教程
Java 教程

共578课时 | 75.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号