Разве шаблон команды не является реализацией принципа инверсии зависимостей?

Шаблон команды состоит из трех основных компонентов: вызывающий, команда и получатель. Клиент предоставляет Invoker информацию, необходимую для вызова определенного метода M в Receiver, в то время как это объект Command (который находится в Receiver ), который на самом деле вызывает M.

a) Чтобы реализовать CP, мы должны отделить логику Invoker от количества команд таким образом, чтобы по мере увеличения количества команд Invoker класс не должен меняться. Мы делаем это, когда объекты Command и Invoker зависят от абстракции (например, интерфейса).

Таким образом, не является ли CP просто конкретной реализацией DIP?

б) Если CP действительно является реализацией DIP, то что именно отличает CP от других типов DIP? выполнение? А именно, разве мы не можем утверждать, что все другие реализации DIP также имеют объект Invoker (т.е. модуль более высокого уровня), объекты Command (т.е. зависимости которые предоставляют модуль более высокого уровня с поведением), в то время как Receiver будет считаться любым методом, который вызывает объект зависимости (т.е. модуль более низкого уровня)?

Спасибо


ИЗМЕНИТЬ:

a)

Зависимый объект сохраняет зависимость как поле и использует ее для всех последующих вызовов метода.

И если зависимый объект не хранит эту зависимость как поле, поэтому он не использует ее для всех последующих вызовов, а вместо этого всегда получает новый объект зависимости, можем ли мы тогда утверждать, что у нас есть CP< /strong> а не DI?

И наоборот — если Invoker всегда вызывает один и тот же объект команды, можем ли мы тогда утверждать, что у нас есть DI, а не CP, независимо от того, какой рабочий объект команды фактически выполняет?

б) Я понимаю, что вы пытаетесь донести, но у меня все еще есть серьезные проблемы с различением того, что делает что-то поведением, а что командой. С моей точки зрения, передача команды Invoker также может быть интерпретирована как введение поведения, необходимого зависимому объекту для выполнения своей работы. Это действительно так однозначно или это более субъективно? Таким образом, как мы решаем, является ли работа, выполняемая объектом, командой или поведением?


person user1483278    schedule 06.07.2012    source источник


Ответы (1)


Шаблон команды ничего внедряет в объект. Он передает команду методу, который вызывает команду (обычно только один раз).

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

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

РЕДАКТИРОВАТЬ:

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

Внедрение зависимостей просто состоит в передаче зависимости один раз при инициализации зависимого объекта. Эта зависимость предлагает большое количество четко определенных методов, которые используются зависимым объектом как часть его собственной бизнес-логики.

Оба используют объекты и методы вызова, но цель очень различна.

Так что мой ответ на ваш пункт а) будет: да или нет, это зависит от того. Если объект является общим объектом, предоставляющим разные методы и не являющимся одной из многих реализаций единого интерфейса с одним методом, который зависимый объект вызывает по своему усмотрению, он не представляет собой команду.

б) Прочитайте пример кода в http://en.wikipedia.org/wiki/Command_pattern, это должно прояснить ситуацию.

person JB Nizet    schedule 06.07.2012
comment
привет, если вы найдете время, чтобы помочь мне еще немного - я отредактировал свой пост - person user1483278; 08.07.2012
comment
Это не отвечает на первоначальный запрос (т.е. принцип инверсии зависимостей против шаблона команды). Он сравнивает внедрение зависимостей с шаблоном команды. Принцип инверсии зависимостей (DIP) и внедрение зависимостей (DI) не следует путать друг с другом. - person Ceddaerrix; 24.05.2021