java - Java 多方法隐藏设计
问题描述
我目前正在实施一项增强设计。需要您对设计的建议。
以下是我的要求:
- 我有 4 种方法,即 -> fetch_schema、transform_schema、stage_schema 和 register_schema
- 我有2个客户。1 个客户端应该只能覆盖 1 个方法 -> transform_schema,另一个客户端应该能够覆盖所有方法
我想到了以下方法:
- 接口 A -> 与获取模式、登台、注册到模式注册表方法的默认实现 (Java 8) 的接口
- 扩展接口 A 的类可以覆盖获取模式、登台、注册到模式注册表方法
- 接口 B -> 转换器的接口,其中包含转换器方法的默认实现
- 扩展接口 B 的类可以覆盖转换器方法
在上述方法中,第一个客户端将仅使用接口 B,而想要覆盖所有方法的第二个客户端可以使用接口 A 和接口 B
示例代码:
interface A {
default fetch_schema(){ // Some default implementation }
default stage_schema(){ // Some default implementation }
default register_schema(){ // Some default implementation }
}
interface B {
default transform_schema(){ // Some default implementation }
}
// Sample class used by client 1
class SampleTransformer implements B {
@Override
transform_schema(){
// Some implementation
}
}
// Sample class used by client 2
class SampleTransformer implements A,B {
@Override
fetch_schema(){
// Some implementation
}
@Override
stage_schema(){
// Some implementation
}
@Override
register_schema(){
// Some implementation
}
@Override
transform_schema(){
// Some implementation
}
}
另一种方法是:
- 接口 A -> 具有获取模式、暂存、注册到模式注册表方法声明的接口
- 扩展接口 A 的类可以覆盖获取模式、登台、注册到模式注册表方法
- 接口 B -> 包含转换器方法声明的转换器接口
- 扩展接口 B 的类可以覆盖转换器方法
在上述方法中,将有一个名为 DefaultSchemaProcessor 的默认 bean,它扩展了接口 A 和 B 并覆盖了必要的方法。
想要覆盖这些方法的各个客户端将定义自己的 bean 并替换 DefaultSchemaProcessor。
第一个客户端的 bean 将仅扩展接口 B,而想要覆盖所有方法的第二个客户端可以使用接口 A 和接口 B
示例代码:
interface A {
fetch_schema();
stage_schema();
register_schema();
}
interface B {
transform_schema();
}
// DefaultSchemaProcessor
class DefaultSchemaProcessor implements A,B {
@Override
fetch_schema(){
// Some implementation
}
@Override
stage_schema(){
// Some implementation
}
@Override
register_schema(){
// Some implementation
}
@Override
transform_schema(){
// Some implementation
}
}
// Sample class used by client 1
class SampleTransformer implements B {
@Override
transform_schema(){
// Some implementation
}
}
// Sample class used by client 2
class SampleTransformer implements A,B {
@Override
fetch_schema(){
// Some implementation
}
@Override
stage_schema(){
// Some implementation
}
@Override
register_schema(){
// Some implementation
}
@Override
transform_schema(){
// Some implementation
}
}
你们有什么建议吗?
解决方案
由于您可以让另一个客户端使用默认实现,因此我建议您使用 Java 8 默认接口方法。使用它将消除对 DefaultSchemaProcessor 的要求。
interface A extends B {
default fetch_schema(){ // Some default implementation }
default stage_schema(){ // Some default implementation }
default register_schema(){ // Some default implementation }
}
interface B {
default transform_schema(){ // Some default implementation }
}
推荐阅读
- ios - Swift - Xcode 11.3 中的不同推送动画?
- spring - 如何将加权平均 MongoDB 查询转换为 Spring Data Query?
- asp.net - 带有 React 的 ASP.NET Core 3.1 - 服务器端渲染/预渲染 - 需要两个 Web 服务?
- python - 如何遍历 CSV 中的列以查找哪一个包含 Python 中的日期行(Pandas)
- sql - 将查询结果分配给变量以用于案例语句
- excel - 打开文件,将文件重命名为变量,并能够使用新名称在整个宏中激活窗口
- java - Firebase 既没有调用 onDataChange 也没有调用 onCancelled
- css - 卡在第一次过渡时隐藏在 chrome 中
- python - Python2 标记化并添加到字典
- python - 如何在正方形内画正方形?