有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个关于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
}

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

public interface Addressable{

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

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

在没有接口和没有为不同类编码的情况下,实现相同功能最优雅的方法是什么


共 (3) 个答案

  1. # 1 楼答案

    如果您无法更改A或B,则必须使用降级的解决方案
    一个简单且设计良好的解决方案当然依赖于一个接口,该接口定义了一个地址检索方法(Address getAddress()),该方法由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
    它可能会破坏实际的客户端代码
    因此,如果你想实现一个真正的适配器,这里也需要一个接口

    如上所述,如果不重新设计最小值AB,真正好的解决方案是复杂的


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

    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(), ...);
       }
    
    }
    

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

  2. # 2 楼答案

    我也遇到过类似的情况,类是在构建过程中生成的。(在我的例子中,构建过程将检查数据库,并为每个数据库表生成一个包含所有字段的类。)

    您声明这些类是在应用程序启动时生成的。如果它们是在构建过程中生成的,您可以向构建过程中添加一个额外的元素,以更改生成的文件。在我的例子中,我们的构建服务器只是Linux,所以我在ant脚本中添加了一行sed

  3. # 3 楼答案

    您可以编写adapters来提供一个公共接口

    public class AdpaterA implements Addressable {
    
      private final A a;
    
      public AdapterA(A a) {
        this.a = a;
      }
    
      @Override public String getStreet() {
        return this.a.street;
      }
    
      // other method is omitted as homework ;-)
    }
    

    然后使用适配器类进行进一步处理