java - 使用哪种设计模式(如果存在)?

标签 java oop design-patterns

我有一个关于 OOP 实现和设计模式的问题。

我有一个无法更改的固定类模型(因为它是在每次应用程序启动时自动生成的)。那里有许多类都带有 equals 字段,如下面的示例所示:如您所见,字段 citystreets 都包含在这两个类中。

public class A{
   String city;
   String street;

   String name;

   ....//get methods
}

public class B{
   String city;
   String street;

   String age;

   ....//get methods
}

我需要从两种类型的类中提取一个地址,并且我想用一种方法实现它(因为将相同的代码写两次似乎很愚蠢)。如果类模型是可变的,我可以添加一个新接口(interface) AddressableAB 可以实现。

public interface Addressable{

     public String getStreet();
     public String getCity();
}

//somewhere in code
public Address getAddress(Addressable addressable){
      return new Address(addressable.getCity(), addressable.getStreet());
} 

在没有接口(interface)且无需为不同类编写相同代码的情况下实现相同功能的最优雅方法是什么?

最佳答案

如果您无法更改 A 或 B,则您的解决方案必然会降级。
一个简单且设计良好的解决方案当然依赖于定义地址检索方法 ( Address getAddress() ) 的接口(interface),该方法 AB将实现。

你也可以定义一个包装类:

public class WrapperA implements Addressable {

  private final A a;

  public WrapperA(A a) {
    this.a = a;
  }

  @Override
  public Address getAddress(){
     return new Address(a.getCity(), a.getStreet(), etc...);
  } 

}

但是如果你必须为许多类复制这种代码,它可能会相当笨拙。
此外客户端将不再操纵A但是一个WrapperA类。
它可能会破坏实际的客户端代码。
所以同样在这里,如果你想实现一个真正的适配器,就需要一个接口(interface)。

如前所述,无需重新设计最低 AB ,一个真正好的解决方案是复杂的。


作为解决方法,您可以定义一个 Address提供工厂方法来创建 Address 的类来自AB实例。

public class Address{

    ... 
   String city;
   String street;
    ... 

   private Address(){
   }

   public static Address of(A a){
     return new Address(a.getStreet(), a.getCity(), ....);
   }

   public static Address of(B b){
     return new Address(b.getStreet(), b.getCity(), ...);
   }

}

然后根据需要使用这些方法按需创建地址。

关于java - 使用哪种设计模式(如果存在)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45709307/

相关文章:

php - 用PHP反转控制

java - JSONObject 中的第二个 JSONArray 不知为何是空的

Java Hibernate 验证返回无效字段

实现相同属性的 C# 类

c++ - 如何创建可以使用字符串参数自动初始化其他类的类

matlab - 如何在 matlab 中对整个类执行导入?

java - 在 Switch-Case-Smell 上重构或使用设计模式

php - 我的工厂应该创建所有对象实例吗?包括新实体吗?

java - 我如何制作多种模式以及程序检测其是双峰还是三峰

java - 迁移 Jersey 2.22.1 至 Jersey 2.22.2