gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:20:32 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com