Стратегия или шаблон адаптера?

Я хочу создать несколько классов каждого поставщика виртуальных серверов, например:

  • Цифровой океан
  • Линод
  • Амазон АВС

У каждого провайдера есть собственный класс PHP (через композитор) для использования их интерфейса API, я хочу использовать их библиотеку классов, но я хочу убедиться, что могу использовать один и тот же метод для каждого провайдера. Пример отключения VPS:

  • Метод API линода: powerOff()
  • Метод API Digital Ocean: haltServer()

Вместо использования powerOff() и haltServer() я хочу использовать метод shutdown() для любых классов поставщиков, которые я создам. Должен ли я использовать дизайн стратегии или шаблон адаптера?


person I'll-Be-Back    schedule 09.01.2017    source источник


Ответы (3)


Должен ли я использовать дизайн стратегии или шаблон адаптера?

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

Оставляя шаблоны проектирования в стороне, похоже, что вы ищете способ предоставить общий интерфейс для выполнения одной и той же функциональности с использованием разных базовых библиотек/подходов. Это очень похоже на абстракцию и делегирование.

Вы можете добиться абстракции, определив общий интерфейс с именем Provider со стандартными методами операций, такими как shutdown, connect, retry и т. д. Затем вы можете создать один конкретный класс провайдера для каждого типа провайдера, такого как AWSProvider и LinodeProvider, и реализовать методы shutdown, connect и retry. Затем вы используете Делегирование, вызывая специфичные для провайдера API внутри этих методов. Например, вызовите метод powerOff внутри метода shutdown класса LinodeProvider.

Если вы теперь внимательно посмотрите на свой дизайн, вы начнете понимать, что он похож на шаблон Strategy, а также на шаблон Adpter. Что отличает эти два шаблона, так это момент времени, когда в игру вступает Абстракция. Если вы решили использовать реализацию Provider через Factory во время выполнения приложения, вы используете шаблон Strategy; однако, если это решение принимается во время компиляции, вы используете шаблон Adapter. Если не считать названия шаблона, ваши классы будут выглядеть практически одинаково.

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

person CKing    schedule 10.01.2017
comment
Аминь. Хотя нужно знать о шаблонах, они не должны влиять на дизайнерские решения, а должны возникать по мере того, как дизайн обретает форму. - person dbugger; 10.01.2017
comment
Что отличает эти два паттерна, так это момент времени, когда Абстракция вступает в игру. Откуда вы это взяли? в идеале не просматривайте список доступных шаблонов проектирования и не выбирайте тот, который лучше всего соответствует вашей проблеме. В этом нет никакого смысла, шаблоны существуют для решения общих проблем проверенным способом. - person plalx; 10.01.2017
comment
@plalx Спасибо за комментарий. 1. Шаблон адаптера вступает в игру, когда вам нужно адаптировать существующую реализацию/библиотеку к вашей кодовой базе. Это то, что невозможно сделать без написания и компиляции новых компонентов/кода. Цель шаблона Strategy, с другой стороны, состоит в том, чтобы позволить вам выбрать подходящую реализацию (обычно во время выполнения) без большого количества изменений во время компиляции (читай factory). Таким образом, момент времени определяет их имя. 2. Вам не обязательно соглашаться, но прочитайте это - person CKing; 10.01.2017
comment
@CKing Спасибо за подробный ответ, очень признателен. Я только что сделал быстрый псевдо-вы можете предложить мне, какой шаблон подойдет: pastebin.com/yYkwPpAG - person I'll-Be-Back; 11.01.2017
comment
@ U'll-Be-Back Я не программист php, но какова цель классов shutdown и powerOn? Этот код в идеале должен быть размещен непосредственно внутри реализации провайдера IMO. - person CKing; 11.01.2017

Ответ на ваш вопрос: адаптер,
Стратегия используется, когда у вас может быть одна или несколько реализаций алгоритма.

p.s. предложение с шаблоном Command также подходит.

person dstar55    schedule 10.01.2017
comment
Спасибо за ответ. Я только что сделал быстрый псевдокод, чтобы вы могли предложить мне, какой шаблон подойдет для такой логики. pastebin.com/yYkwPpAG - person I'll-Be-Back; 11.01.2017
comment
ну, я не эксперт в PHP, но посмотрите этот пример, sourcemaking.com/design_patterns/adapter/php класс BookAdpater - это место, где осуществляется адаптация - person dstar55; 11.01.2017

Здесь лучше всего подходит ни Strategy, ни Adaptor. На мой взгляд, вам следует проверить Шаблон команды.

Этот шаблон решает ту же проблему, которую вы задаете. Он предоставит единственный метод, как вы просили в вашем случае shutdown, и через зависимость он может вызывать любой метод, предоставляемый зависимостью.

person Ubercool    schedule 10.01.2017
comment
Даже если предположить, что ОП использует шаблон Command, ваше обоснование больше похоже на шаблон Strategy. Одним из компонентов шаблона команды является Invoker. Можете ли вы указать, что будет Invoker в этом конкретном случае? - person CKing; 10.01.2017