【问题标题】:Efficient way to share the same interface implementation between two or more classes在两个或多个类之间共享相同接口实现的有效方法
【发布时间】:2015-09-01 22:59:59
【问题描述】:

假设类库的一部分具有以下层次结构:

class Super {
  void doSomething() {
    System.out.println("Super is doing something");
  }
}

class SubOne extends Super {
  @Override
  void doSomething() {
    System.out.println("SubOne is doing something");
  }

  void doSomethingElse() {
    System.out.println("SubOne is doing something else");
  }
}

class SubTwo extends Super {
  @Override
  void doSomething() {
    System.out.println("SubTwo is doing something");
  }

  void doSomethingDifferent() {
    System.out.println("SubTwo is doing something different");
  }
}

现在有人定义了一个与 SubOne 和 SubTwo 类相关的新接口提供行为:

interface NewBehavior {
  void doSomethingNew();
}

据我所知,如果我们不能修改 Super、SubOne 和 SubTwo 的源代码,有两种方法可以定义实现 NewBehavior 的 SubOne 和 SubTwo 的新版本。

一种是在 Super 的子类中实现 NewBehavior,然后通过子类化新版本的 Super(并可能包装 SubOne 和 SubTwo 对象)来创建新版本的 SubOne 和 SubTwo:

class ExtendingSuperNewBehavior extends Super
implements NewBehavior {
  @Override
  public void doSomethingNew() {
    System.out.println("ExtendingSuperNewBehavior is doing something new");
  }  
}

class ExtendingSuperSubOneNewBehavior extends ExtendingSuperNewBehavior {
  // Here we need to either wrap SubOne or redefine doSomethingElse()
  // with the same implementation.
  // SubOne mSubOne = new SubOne();
  // void doSomethingElse() {
  //   mSubOne.doSomethingElse();
  // }

   void doSomethingElse() {
    System.out.println("SubOne is doing something else");
  }
} 

class ExtendingSuperSubTwoNewBehavior extends ExtendingSuperNewBehavior {
  // Here we need to either wrap SubTwo or redefine doSomethingDifferent()
  // with the same implementation.
  // SubTwo mSubTwo = new SubTwo();
  // void doSomethingDifferent() {
  //   mSubTwo.doSomethingDifferent();
  // }

   void doSomethingDifferent() {
    System.out.println("SubTwo is doing something different");
  }
} 

另一种是定义一个实现NewBehavior的类,并在SubOne和SubTwo的每个新版本中包装一个实例:

class NewBehaviorImpl implements NewBehavior {
  @Override
  public void doSomethingNew() {
    System.out.println("NewBehaviorImpl is doing something new");
  }
}

class ImplementingSubOne extends SubOne 
implements NewBehavior {
  NewBehavior mNewBehavior = new NewBehaviorImpl();

  public void doSomethingNew() {
    mNewBehavior.doSomethingNew();
  }
}

class ImplementingSubTwo extends SubTwo 
implements NewBehavior {
  NewBehavior mNewBehavior = new NewBehaviorImpl();

  public void doSomethingNew() {
    mNewBehavior.doSomethingNew();
  }
}

显然,这两种方法都有效,但如果 SubOne 和/或 SubTwo 公开一个大接口(如库类通常所做的那样),则无论选择哪种方法,都需要进行大量方法转发。

谁能想出一种方法来重用相同的接口实现来避免代码转发?这会很有帮助。

【问题讨论】:

  • 使用回调的观察者模式值得研究

标签: java interface code-reuse


【解决方案1】:

考虑使用像 AspectJ 这样的 AOP(面向方面​​编程)库。您可以使用 AOP 做的一件事是向现有类引入额外的属性或方法。在您的示例中,您将透明地添加新方法到 SubOne 和 SubTwo 子类,而无需接触这些类。 AOP 应用程序基本上会以透明的方式使用原始类的代理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 2014-10-25
    • 2015-01-31
    • 1970-01-01
    • 2013-07-03
    • 2018-10-31
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多