java为另一个接口创建一个包装器接口

时间:2011-08-09 19:51:13

标签: java interface

我面临的问题如下 -

  1. 我正在使用第三方库,比如说编辑器,它有一个界面 EditorActions ,带有方法 -

    创建(),编辑(),删除()。

  2. 我不想在我的实现中公开 EditorActions 的方法。所以我的界面会有像 -

    这样的方法

    myCreate(),myEdit(),myDelete(),它们应该调用EditorActions方法。

    EditorActions只是一个接口,实现是库的内部。

    如何在不实现其中任何一个的情况下链接2个接口?

  3. 感谢您的所有帮助

3 个答案:

答案 0 :(得分:2)

您可以通过公开希望人们在抽象类中使用的方法来实现此目的。然后强迫人们实现您希望他们使用的特定方法。

然后,您可以使用EditorActions界面中的方法以及强制实施的方法。

public abstract class AbstractEditorActions {

   private EditorActions ea;

   public AbstractEditorActions(EditorActions ea) {
      this.ea = ea;
   }

   // In this method, you can use the methods
   // from the interface and from this abstract class.
   // Make the method final so people don't break
   // the implementation.
   public final void yourExposedMethod() {
      // code
      this.toImplement();
      ea.doMethod();
   }

   protected abstract toImplement();

}

答案 1 :(得分:0)

假设您从库中获得EditorActions的实例,您可以这样做:

public class FooActions implements MyEditorActions, EditorActions{
    private EditorActions internal;

    public FooActions(EditorActions internal){
        this.internal = internal;
    }

    @Override
    public void create(){
        internal.create();
    }

    @Override
    public void myCreate(){
        // do stuff
        this.create();
    }
}

这样做是用一个实现相同接口的对象包装库对象的实例。然后,您只需将对象公开为您想要的任何接口。

EditorActions a1 = new FooActions(); // a1 only shows library methods
MyEditorActions a2 = a1; // now a2 only shows your methods

答案 2 :(得分:0)

  

如何在不实现其中任何一个的情况下链接2个接口?

你做不到。你想在这里做自动魔术。不要做魔法。无论如何,你必须实现其中任何一个。

或者,你必须实现自己的反射管道(或某种方式的AOP)来动态创建类。后者不是一种琐碎的方式,通常是一种过度杀伤和过度工程的红旗,只是为了避免实现相当于普通的delegate

OTH,如果您只想“公开”第三方接口 A 提供的方法的子集(例如,只有getter方法),您几乎可以轻而易举地创建(通过良好的旧肘部油脂或反射库)接口 B ,只暴露您想要的方法子集。

interface DirtyThirdPartyInterface {     StupidCrap getSomeStupidCrap();     void setStupidCrap(); }

接口MySanitizedInterface {    StupidCrap getSomeStupidCrap();    // setter不是此接口的一部分 }

然后使用Spring AOP或类似的东西或其中一个反射库,那么你可以自动生成MySanitizedInterface的实现作为AOP拦截器,它只是代理对getter的调用(通过反射)来第三方界面中的吸气剂。

但是,再次,这是很多废话(更不用说第三方库依赖),简单地避免简单的手工编码。很难找到一个真实的案例来证明所有管道工具的合理性。如果我遇到类似的事情,我会想到的第一件事就是“红旗”。 YMMV当然。