Есть ли разница между этими двумя методами? Если это так, какой метод лучше?
Первый способ
Используя абстрактный класс:
//Client class:
class Client extends Context
{
public function insertData()
{
$this->chooseStrategy(new DataEntry());
$this->algorithm();
}
public function findData()
{
$this->chooseStrategy(new SearchData());
$this->algorithm();
}
public function showAll()
{
$this->chooseStrategy(new DisplayData());
$this->algorithm();
}
}
//Context class:
abstract class Context
{
private $strategy;
public function chooseStrategy(IStrategy $strategy)
{
$this->strategy = $strategy;
}
public function algorithm()
{
$this->strategy->algorithm();
}
}
Второй способ
Используйте простой класс
//Client class:
class Client
{
public function insertData()
{
$context = new Context(new DataEntry());
$context->algorithm();
}
public function findData()
{
$context = new Context(new SearchData());
$context->algorithm();
}
public function showAll()
{
$context = new Context(new DisplayData());
$context->algorithm();
}
}
//Context class:
class Context
{
private $strategy;
public function __construct(IStrategy $strategy)
{
$this->strategy = $strategy;
}
public function algorithm()
{
$this->strategy->algorithm();
}
}
Оба метода используют один и тот же интерфейс IStrategy и один и тот же класс Strategy.
Задача ещё не решена.
Других решений пока нет …