2012-06-13 2 views
2

У меня есть проблема разработкиСоветы по дизайну класса

Мне нужно создать метод, DoSomething, когда йоЗотеЬЫпд вызывается в случае, когда А его подпись отличается, когда она вызывается к случаю Б.

doSomething(param1, param2) When called from A 
doSomething(param3, param4) When called from B 

изначально я хотел создать интерфейс и реализовать его в случае а и в случае в

(пс. я на самом деле нужно несколько таких методов с тем же вопросом

doSomething1(T) When called from A 
doSomething1(X) When called from B 

doSomething2(E) When called from A 
doSomething2(N) When called from B 

и т. Д.)

Не могли бы вы предложить предпочтительный дизайн?


Edit: изменен вопрос надеется, что это понятнее

+2

Что такое «случай» в этом? Это класс? Существует ли связь между типами параметров? Этот вопрос очень трудно понять. – ftr

+2

Я не совсем понимаю ваши обозначения. Имена классов 'A',' B' и т. Д.? Является ли 'A' в списке параметров тем же« A », что и в« От A »? Какова проблема дизайна? –

+2

Не можете ли вы просто перегрузить? – adarshr

ответ

2

Вы можете использовать Java Generics с Strategy Design Pattern, чтобы преодолеть эту проблему:

позволяет предположить, у вас есть два «дела» case1 и Случай 2, и вы, мы будем называть классы, которые имеют метод йоЗотеЬЫпд() для каждый случай «обработчики».

Сначала мы будем иметь интерфейс, который определяет обработчик:

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 поможет вам здесь.

В основном, у вас есть тот же бизнес, выполненный на разных типах объектов. Вы можете переместить эти отличия в другой класс (Стратегия) и применить эту стратегию к реализации обработчика .

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 

Если йоЗотеЬЫпд() делает одно и то же в обоих этих методов, то вы можете реализовать метод как doSometing (S), где S является интерфейс реализуется как T и X.

Если T и X весьма различны то вы можете захотеть иметь отдельные классы DoerT и DoerX, которые предоставляют doSomething (T) и doSomething (X) соответственно.

Смежные вопросы