首页 > 解决方案 > Java 多方法隐藏设计

问题描述

我目前正在实施一项增强设计。需要您对设计的建议。

以下是我的要求:

  1. 我有 4 种方法,即 -> fetch_schema、transform_schema、stage_schema 和 register_schema
  2. 我有2个客户。1 个客户端应该只能覆盖 1 个方法 -> transform_schema,另一个客户端应该能够覆盖所有方法

我想到了以下方法:

  1. 接口 A -> 与获取模式、登台、注册到模式注册表方法的默认实现 (Java 8) 的接口
  2. 扩展接口 A 的类可以覆盖获取模式、登台、注册到模式注册表方法
  3. 接口 B -> 转换器的接口,其中包含转换器方法的默认实现
  4. 扩展接口 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
    }
}

另一种方法是:

  1. 接口 A -> 具有获取模式、暂存、注册到模式注册表方法声明的接口
  2. 扩展接口 A 的类可以覆盖获取模式、登台、注册到模式注册表方法
  3. 接口 B -> 包含转换器方法声明的转换器接口
  4. 扩展接口 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
    }
}

你们有什么建议吗?

标签: javadesign-patternsjava-8

解决方案


由于您可以让另一个客户端使用默认实现,因此我建议您使用 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 }
}

推荐阅读