2013-04-18 2 views
0

Мой сценарий выглядит так:Рекомендации по ООП для проектирования объектов обмена сообщениями

У меня есть система обмена сообщениями, когда вы отправляете сообщение в разные адресаты по типу сообщения.

, что мой текущий дизайн:

Abstract class: MessageKindAbs 

MessageKind1 extends MessageKindAbs 
MessageKind2 extends MessageKindAbs 
MessageKind3 extends MessageKindAbs 

и так далее ..

Теперь MessageKind3 это особый вид. его цель - отправить содержимое MessageKind1 или MessageKind2 для регистрации процесса.

Так что я создал внутри MessageKind3 список MessageKind3Items:

list<MessageKind3Item> MessageKind3ItemList... 

MessageKind3Item включает информацию о MessageKind1/MessageKind2 для целей регистрации.

поэтому в основном, что происходит, каждый MessageKind3Item также включает в себя MessageKindAbs тип.

, но это не имеет для меня никакого смысла.

Например: отправить сообщение в очередь БД и зарегистрировать информацию, содержащуюся в MessageKind1, и MessageKind2.

Так что мой дизайн ООП был немного сложнее.

Любой может помочь мне найти свой путь сюда?

Возможно, я создал внутри MessageKind3Item другой тип экземпляра MessageKindAbs, но я не уверен, что это имеет смысл.

спасибо, лучей,

ответ

0

Я мог бы создать внутри MessageKind3Item другой тип экземпляра MessageKindAbs, но я не уверен, что это имеет смысл.

Вы не можете, это абстрактно.


Поскольку MessageKind3 предназначен для регистрации, поэтому его структура известна. Таким образом, для MessageKind3 элементов создать специальный класс LogItem, который будет инстанцированный что-то вроде:

LogItem createLogItem(MessageKind1) { return new LogItem(); } 
LogItem createLogItem(MessageKind2) { return new LogItem(); } 

И присоединить эти детали к MessageKind3.

Вы пытаетесь объединить все свои классы с наследованием, и это была проблема.

+0

Я имею в виду ссылочный тип не экземпляр. 2. Я пытаюсь использовать ООП, чтобы свести к минимуму плотное соединение. – rayman

+0

Извините, я не уверен, что вы имеете в виду. Мое предложение состоит в том, чтобы вводить в журнал элементы, а не экземпляры разных классов - это уменьшит связь компонентов и их знания друг о друге. – Vitaly

+0

MessageKind3 Предположим, что нужно делать больше вещей, а затем просто регистрировать. регистрация MessageKind1/MessageKind2 была всего лишь одним примером. он мог бы, например, отправить эти сообщения в службу электронной почты. Я просто приведу пример. дело в том, что каждый объект MessageKind должен быть адресован другому месту назначения, в то время как MessageKind3 содержит информацию MessageKind1 и MessageKind2 – rayman

3

Пусть все сообщения, которые могут быть отправлены в процессе журнала реализации интерфейса. Например:

public interface Logable { 

    void logTo(PrintWriter write); 
} 

Чем MessageKind3 нужно только поддерживать список Logable. Обратите внимание, что использование PrintWriter - всего лишь предложение. Вам может понадобиться более сложный тип параметров, чтобы облегчить ведение журнала в реализации интерфейса.

MessageKind3 будет выглядеть следующим образом:

public class MessageKind3 extends MessageKindAbs { 

    private List<Logable> logables; 

    //... 

    public List<Logable> getLogables() { 
     return Collections.unmodifiableList(logables); 
    } 
} 

И logables будет содержать экземпляры MessageKind1 или MessageKind2, так как они реализуют Logable.

+0

так как MessageKind3 будет включать в себя информацию MessageKind1 и MessageKind2? – rayman

+0

@ rayman Я продлил свой ответ соответственно. – SpaceTrucker

+0

Итак, если у меня есть больше операций, таких как «email-ables» или «monitor-ables», я просто дублирую все списки? – rayman

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