PHP - паттерн "Стратегия (Strategy)"
В этой статье я расскажу про php - шаблон проектирования "Стратегия" и в каком контексте применил его я.
Все мы знаем, что верстка сайта, т.е. его front -часть, должна быть не только кроссбраузерной, но еще и адаптивной. То есть в зависимости от типа ОС и клиента, нам часто нужно совершать какие-то определенные действия: подключать дополнительный стили и скрипты или же редиректить на заглушку. В парадигме ООП я для решения данной задачи я решил использовать паттерн "Стратегия".
Стратегия, Strategy — поведенческий шаблон проектирования, предназначенный для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путем определения соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют.
Применяется в одном и том же случае, в зависимости от текущего состояния системы или её окружения, используются различные алгоритмы.
Что было нужно мне. В зависимости от типа клиента (браузера и операционной системы) совершать какие-то определенные действия, в частности, если в качестве браузера используется IE7 и ниже, редиректить на заглушку. Далее, при реализации адаптивной верстки, скорее всего понадобится подключать какие-нибудь дополнительные плагины и т.д., если же существует приложение для Андроид или Айфон, давать ссылку на скачивание этого приложения. Ну мало ли чего еще в будущем понадобится!
А теперь небольшой высер пример кода с описанием из котрого все станет ясным:
<?php
abstract class AppNamingStrategy {
abstract public function make();
}
class OldIe extends AppNamingStrategy {
public function make() {
if ($conf_redirect== true) {
// редирект на страницу с заглушкой
}
}
}
class Android extends AppNamingStrategy {
public function make() {
// подключение доп файлов css
}
}
class AppStrategy {
public function __construct() {
// лучше передавать как параметр
$app = App::get_all();
if ($app->browser == 'ie7') {
$obj = new OldIe();
$obj->make();
}
if($app->os == 'adnroid'){
$obj = new Android();
$obj->make();
}
}
}
?>