课堂设计的建议

时间:2012-06-13 08:18:19

标签: java design-patterns

我有设计问题

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

等...)

您能否建议一个首选设计?


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

3 个答案:

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