咨询

2012-06-13 77 views
2

我有一个设计问题咨询

我需要创建方法,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 

等)

能否请您提出一个优选的设计?


编辑:改变了问题希望这是更清晰

+2

这是什么情况?这是一堂课吗?参数类型之间是否存在关系?这个问题很难理解。 – ftr

+2

我不清楚你的符号。是'A','B'等类名?参数列表中的“A”与“From A”中的A相同吗?什么是设计问题? –

+2

你不能简单地使用重载? – adarshr

回答

2

您可以使用Java泛型与策略设计模式来解决这个问题:

让我们假设你有两个“案件”情况1和情况2,和你,我们称之为具备为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 
    } 

} 

,你就会有案例2有着相似的应用。

现在,您仍然编码doSomething()和doSomethingElse()两次相同的业务,Strategy Pattern可以帮助您。

基本上,您可以对不同类型的对象执行相同的业务。您可以将这些差异移到另一个类别(策略),并将此策略注入执行Handler的一个

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

所以,你有一个处理一个特定类型的数据的方法,而是从一个类或其他调用的时候,数据看起来有点不同。

如果这是不正确的,你的数据是完全不同的和不相关的,你可能真的想要做几种方法。

如果数据是相似的,我建议你创建一个包含像这样的数据的对象:

public class MyData { 
    public MyData(A, B, C){ /* Do your thing */ } 
    public MyData(D, E, F){ /* Do your other thing */ } 

然后有你试图实现需要MyData的对象作为参数的接口

doSomething(MyData data); 

这就是我可能会用你已经解释过的,但如果这不起作用,请随时给我们反馈!

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类。