java - 使用泛型重构多个重载方法

标签 java generics overloading

我有一个包含多个重载方法的类,例如:

interface SharedInterface
{
   public void commonMethod();
}

class Model1 implements SharedInterface
{
   public void commonMethod(){}
   public int foo(){ return 1; }
}

class Model2 implements SharedInterface
{
   public void commonMethod(){}
   public String bar(){ return "2"; }
}

class Client
{
   private ExternalClass external = new ExternalClass();

   public void handle( Model1 model )
   {
       external.calculate( model.foo() );
   }

   public void handle( Model2 model )
   {
       external.calculate( model.bar() );
   }
}

我想让 Client 类更加通用,以便它将来可以处理任何类型的 Model。但是,由于每个 Model 都有自己特定的公共(public)方法,因此 Client.handle() 方法需要根据给定的 Model 来更改其行为。例如,如果给定 Model1 实例,则调用该模型的方法 foo() ;如果给定了 Model2 实例,则调用方法 bar() 等。将来会创建更多类型的模型。下面的解决方案打破了开闭原则,看起来是一个非常糟糕的做法:

class Client
{
   private ExternalClass external = new ExternalClass();

   public void handle( SharedInterface model )
   {
       if( model instanceof Model1 )
          external.calculate( model.foo() );
       else if( model instanceof Model2 )
          external.calculate( model.bar() );
   }
}

我正在考虑使用泛型,但我不确定泛型如何解决这个问题。

请注意,Client 类具有依赖项(使用库)。模型必须是 POJO,不依赖于任何其他类。因此,由于 Client.handle() 的实现利用了这些依赖项,因此该方法无法移动到 Model 类内部。

有人可以提供一些替代方案吗?

最佳答案

访客设计模式最适合您的问题...链接可以帮助您解决问题 https://sourcemaking.com/design_patterns/visitor ..

关于java - 使用泛型重构多个重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32412595/

相关文章:

java - 如何注册和引用回调接口(interface)?

Java 多线程中的 volatile 关键字

java - java中的FileNotFoundException

java - 栈数组

c++ - 错误 C2228 : left of '.values' must have class/struct/union

C++双向运算符,可能吗?

java - 重载和覆盖泛型方法 - java

java - ClassNotFoundException Java Applet

java - 有没有 "Down casting"Collection<的场景?将 T> 扩展到 Collection<T> 是有意义的

c#获取泛型类中泛型类型参数的名称