我有设计问题
我需要创建方法,doSomething,当doSomething被调用到案例A时,它的签名与调用案例B时的签名不同。
doSomething(param1, param2) When called from A
doSomething(param3, param4) When called from B
最初我想创建一个接口,并在案例A和案例B
中实现它(ps。我实际上需要几个具有相同问题的方法
doSomething1(T) When called from A
doSomething1(X) When called from B
doSomething2(E) When called from A
doSomething2(N) When called from B
等...)
您能否建议一个首选设计?
编辑:改变问题希望它更清楚
答案 0 :(得分:2)
您可以将Java Generics与Strategy Design Pattern结合使用来解决此问题:
假设你有两个“case”Case1和Case2,我们将为每个案例“Handlers”调用具有doSomething()方法的类。
首先,我们将有一个定义处理程序的接口:
public interface Handler<TYPE1, TYPE2, TYPE3>{
void doSomething(TYPE1, TYPE2, TYPE3);
void doSomethingElse(TYPE3);
}
您的处理程序如下:
public class Case1Handler implements Handler<Case1Type1, Case1Type2, Case1Type3>{
public void doSomething(Case1Type1 t1, Case1Type2 t2, Case1Type3 t3){
// do case 1 business
}
public void doSomethingElse(Case1Type3 t3){
// do case 1 business
}
}
你将对Case2有类似的实现。
现在,您仍在编写doSomething()和doSomethingElse()两次的相同业务,策略模式可以帮助您。
基本上,您在不同类型的对象上执行相同的业务。您可以将这些差异移到另一个类(The Strategy),并将此策略注入Handler的 one 实现。
public class HandlerImpl<TYPE1, TYPE2, TYPE3> implements Handler<TYPE1, TYPE2, TYPE3>{
private Strategy<TYPE1, TYPE2, TYPE3> strategy;
public HandlerImpl(Strategy<TYPE1, TYPE2, TYPE3> strategy){
this.strategy = strategy;
}
public void doSomething(TYPE1 t1, TYPE2 t2, TYPE3 t3){
// do your business using "strategy"
}
public void doSomethingElse(TYPE3 t3){
// do your business using "strategy"
}
}
这似乎有点矫枉过正,但绝对不是。这使您的代码更清晰,更改(添加新案例,更改业务)将更容易实现:)
答案 1 :(得分:1)
所以,你有一个处理特定类型数据的方法,但是当从一个类或另一个类调用时,数据看起来有点不同。
如果这不正确且您的数据完全不同且无关,您可能真的想要做几种方法。
如果数据相似,我建议创建一个包含如下数据的对象:
public class MyData {
public MyData(A, B, C){ /* Do your thing */ }
public MyData(D, E, F){ /* Do your other thing */ }
然后让您尝试实现的接口将MyData对象作为参数
doSomething(MyData data);
这就是我可能会对您所解释的内容做些什么,但如果不起作用,请随时给我们反馈!
答案 2 :(得分:1)
doSomething1(T) When called from A
doSomething1(X) When called from B
如果doSomething()在这两种方法中做同样的事情,那么你可以实现doSometing(S)方法,其中S是由T和X实现的接口。
如果T和X完全不同,那么你可能想要分别提供doSomething(T)和doSomething(X)的DoerT和DoerX类。