2

我有一个设计问题

我需要创建方法 doSomething,当 doSomething 被调用到 case A 时,它的签名与调用 case 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

ETC...)

你能推荐一个首选的设计吗?


编辑:改变的问题希望它更清楚

4

3 回答 3

2

您可以使用带有策略设计模式的 Java 泛型来克服这个问题:

假设您有两个“案例”Case1 和 Case2,我们将为每个案例“处理程序”调用具有 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() 编写相同的业务两次,策略模式将在这里为您提供帮助。

基本上,您对不同类型的对象执行相同的业务。您可以将这些差异移至另一个类(策略)并将此策略注入到 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"
    }

}

这可能看起来有点矫枉过正,但绝对不是。这使您的代码更清晰,更改(添加新案例,更改业务)将更容易实现:)

于 2012-06-13T09:07:59.117 回答
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);

这就是我可能会对你解释的内容做的事情,但如果这不起作用,请随时给我们反馈!

于 2012-06-13T08:25:48.600 回答
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。

于 2012-06-13T08:44:17.367 回答