【发布时间】:2020-01-27 23:06:57
【问题描述】:
假设我的应用程序有一些服务实现为ClassA 和ClassB。两者有一些相似之处,但也有不同。
- 两个类都有一个
start()方法,具有相同的方法签名但不同的实现。 - 两个类都有一个
process()方法,具有不同的签名和不同的实现。 - 两个类都有相同的
log()方法,即代码完全相同。
A 类
public class ClassA {
public String start(String s1, String s2) {
startImplementation();
return someString;
}
public String process(String s) {
processingImplementation();
return processedString;
}
private String log(String s) {
logImplementation();
return sharedString;
}
}
B 类
public class ClassB {
public String start(String s1, String s2) {
otherStartImplementation();
return someString;
}
public String process(Long l) {
otherProcessingImplementation();
return processedString;
}
private String log(String s) {
logImplementation();
return sharedString;
}
}
我无法思考如何以更通用的方式组织它的“设计模式”。从 3 开始。我可以轻松地将这个方法移动到 ClassA 和 ClassB 扩展的超类。但是我将/可以如何设计应用程序以便同时考虑 1. 和 2.?
第 1 项对我来说听起来有点像一个接口,但我不知道如何将它与第 3 项的超类结合起来。那么第 2 项呢?
【问题讨论】:
-
当然你只能将common行为提取到common超类。将 不同 的东西提取到 common 类中是没有意义的,不是吗?所以当你的方法有不同的签名和不同的实现时,它们不应该去任何公共类。简而言之:提取两个类的共同点,并在具体实现中留下差异。
-
也许 oan 对具有不同参数的类似方法使用泛型。但这在很大程度上取决于这些方法的实际作用,所以这只是一个猜测。我怀疑这里的任何人都可以给你一个更具体的答案,因为你的问题很模糊。
-
实现适配器。
-
值得一问:你有没有想过让他们成为同一个班级(比如一个
start重命名)?这些真的是不同的类型,必须属于不同的类吗? -
您没有提供足够的信息。如果不知道如何使用这些类,就无法设计它。当来电者打电话时,例如
start(),它是否期望 A 和 B 之间的语义一致?其余的方法呢?
标签: java oop design-patterns