2013-05-22 1 views
1

Скажем, в моей программе у меня есть класс, называемый Robot, который наследуется от какого-то другого класса.Применить шаблон посетителя как механизм расширения для одного класса

До сих пор у меня есть методы внутри Robot как addPart или getCost. Теперь меня попросят добавить к нему новый модуль функциональности (несколько методов, которые используют его части), но они явно просят добавить новый модуль, практически не влияя на текущий класс.

Я думал, что Visitor может решить эту проблему, но дело в том, что я не буду применять шаблон к иерархии. Это правильная вещь? (Как вы можете видеть мой Robot является частью композиционного материала)

enter image description here

ответ

1

Фундаментально, я согласен с вашим подходом. Вы успешно определили подход, позволяющий расширить Robot (составной составной компонент) без фактического изменения класса Robot. Единственные изменения, которые я сделал бы следующее:

Я хотел бы ввести новый интерфейс под названием что-то вроде IPartsComposite, который будет определять Accept метода. Этот интерфейс будет реализован Робот, так как он состоит из Часть экземпляров.

База посетителей будет базовой общий класс или интерфейс т.е. посетителей < Т >. Этот тип определит один метод Посетите (T). Тогда, в вашем случае, у вас будет три конкретные реализации Посетитель <IPartsComposite>.

  • PartsVisitorService
  • PartsVisitorCosts
  • PartsVisitorProduction

В каждом из этих конкретных классов вы бы реализовать посещения (IPartsComposite).

+0

На самом деле, я думаю, что сейчас у меня есть проблема с этим подходом. Каждая функция Visit должна возвращать что-то другое, поэтому я не знаю, является ли этот шаблон более жизнеспособным для этого. – user2313248

+1

@ user2313248 Ну, вы можете изменить подпись Visit, чтобы вернуть общий объект Result. Результат может обернуть каждый из разных типов возврата. – Josh