Шаблон проектирования "Стратегия"(Pattern Strategy).
Продолжаем говорить про паттерны проектирования и сегодня мы рассмотрим шаблон проектирования "стратегия"(pattern strategy).
Суть данного шаблона проста - в зависимости от каких-то условий выбрать нужную тактику. Лучше рассмотреть на практике.
<?php
abstract class FileNamingStrategy {
abstract function createLinkName($fileName);
}
class ZipFile extends FileNamingStrategy {
function createLinkName($fileName) {
return "http://localhost/download/$fileName.zip";
}
}
class TarGzFile extends FileNamingStrategy {
function createLinkName($fileName) {
return "http://localhost/download/$fileName.tar.gz";
}
}
class FileStrategy {
protected $_type;
function __construct() {
if(strstr($_SERVER["HTTP_USER_AGENT"], "Win"))
$this->_type = new ZipFile();
else
$this->_type = new TarGzFile();
}
public function getLink($name) {
return $this->_type->createLinkName($name);
}
}
$obj = new FileStrategy();
$link1 = $obj->getLink("file_one");
$link2 = $obj->getLink("file_two");
print <<<LIST
<h1>Список файлов для скачивания:</h1>
<p>
<a href="$link1">Первый файл</a>
<a href="$link2">Второй файл</a>
</p>
LIST;
?>
Итак, у нас есть 2 класса: ZipFile и TarGzFile. Первый возвращает нам ссылку на скачивание файла в .zip формате, а второй в .tar.gz формате. В классе FileStrategy, в конструкторе, мы проверяем заголовок USER_AGENT и, если там присутствуют буквы Win, то создаём объект класса ZipFile, иначе же создаём объект класса TarGzFile. Потом мы создаём объект FileStrategy и вызываем метод getLink, который вернёт нам наш файл в нужном формате. Т.е. суть его в том, что мы не знаем, какой объект у нас будет, за нас это проверяет наш класс и возвращает нужный.
Итак, сегодня мы разобрали ещё один очень часто используемый шаблон проектирования "стратегия".
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.