【问题标题】:Java pattern to change API interface name?更改 API 接口名称的 Java 模式?
【发布时间】:2011-06-10 15:56:57
【问题描述】:

是否有某种模式/解决方案可以用来实现以下目标:

我使用的 API 有一个名为 ApiInterface 的接口。
该接口有1个方法:void apiMethod(BaseType val);

现在,我想使用此功能,但我想使用自己的接口、不同的方法名称和BaseType 的子类型:

interface MyInterface {
  void myMethod(MyType val); 
}

MyType 扩展了 BaseType。 myMethod 应该只调用 apiMethod,唯一的区别是它使用 MyType。

有没有办法创建MyInterface,这样它只是传递到ApiInterface,但使用不同的方法名称和我自己的BaseType扩展?我设法使用扩展 ApiInterface 的抽象类来做到这一点,但我想使用接口,而不是类。

【问题讨论】:

  • 你不能在接口中“暴露功能”,它们没有行为,只有常量和方法契约。如果你想提供实现(委托给ApiInterface),你需要通过一个类来实现。

标签: java design-patterns interface


【解决方案1】:

您可以尝试适配器设计模式。它会帮助你。

【讨论】:

    【解决方案2】:

    首先,接口不实现任何东西。所以你的 ApiInterface 应该已经定义了:

       void apiMethod(BaseType val);
    

    要么应该有一些具体的类来实现这个方法,要么你必须自己实现它。

    但除此之外,您可能还需要一个适配器。

    public interface ApiAdapter{
        void myMethod(MyType val);
    }
    
    public class ConcreteAdapter implements ApiAdapter{
         void myMethod(MyType val){
             ApiInterface api = new ConcreteApiClass();
             api.apiMethod(val);//should work since MyType extends BaseType
         }
    }
    

    现在您可以在您的代码中声明 ConcreteAdapter 对象并使用 MyType 调用 myMethod ,而无需引用 ApiInterface 等。

    【讨论】:

      【解决方案3】:

      这样的事情怎么样:

      public class ApiAdapter implements MyInterface {
        private final ApiInterface delegate;
      
        public ApiAdapter(ApiInterface delegate) {
          this.delegate = delegate;
        }
      
        public void myMethod(MyType value) {
          delegate.apiMethod(value);
        }
      }
      

      现在,如果您的代码引用了 ApiInterface 实例,并且您想将其转换为 MyInterface 实例,您可以执行以下操作:

      ApiInterface instance = ...;
      MyInterface adaptedInstance = new ApiAdapter(instance);
      

      现在您可以将adaptedInstance 转交给需要MyInterface 的任何人

      【讨论】:

        猜你喜欢
        • 2014-12-05
        • 2019-06-15
        • 1970-01-01
        • 2013-03-07
        • 2019-12-07
        • 1970-01-01
        • 2019-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多