Sufir
Я не волшебник, я только учусь
Википедия предлагает следующий вариант реализации Стратегии
Однако мне остаётся не понятно, какую роль должен выполнять Context. Если мы имеем несколько классов реализующих необходимый интерфейс, то зачем эта обёртка и почему не пользоваться классами напрямую?
Может кто-то объяснить или дать хороший пример в реальном коде?
PHP:
<?php
interface NamingStrategy {
function createName($filename);
}
class ZipFileNamingStrategy implements NamingStrategy {
function createName($filename)
{
return "http://downloads.foo.bar/{$filename}.zip";
}
}
class TarGzFileNamingStrategy implements NamingStrategy {
function createName($filename)
{
return "http://downloads.foo.bar/{$filename}.tar.gz";
}
}
class Context {
private $namingStrategy;
function __construct(NamingStrategy $strategy)
{
$this->namingStrategy = $strategy;
}
function execute()
{
$url[] = $this->namingStrategy->createName("Calc101");
$url[] = $this->namingStrategy->createName("Stat2000");
return $url;
}
}
if (strstr($_SERVER["HTTP_USER_AGENT"], "Win"))
$context = new Context(new ZipFileNamingStrategy());
else
$context = new Context(new TarGzFileNamingStrategy());
$context->execute();
PHP:
// Как-то так
if (strstr($_SERVER["HTTP_USER_AGENT"], "Win")) {
$strategy = new ZipFileNamingStrategy();
} else {
$strategy = new TarGzFileNamingStrategy();
}
$strategy->createName("Stat2000");
$strategy->createName("Calc101");