Есть pool worker'ов, в каждом worker'e есть шаги которые надо менять из самих же шагов, я для этого передаю worker в сам шаг по ссылке, но мне такое решение кажется не очень красивым и тяжело поддерживаемым.
class WorkerPool
{
$pool;
public function addWoker(Worker $worker)
{
# code...
}
public function deleteWorker(Worker $worker)
{
# code...
}
}
class Worker
{
$state;
public function setStep(Step $step)
{
# code...
}
public function incr()
{
$this->state++;
}
}
abstract class Step
{
$worker;
function __construct(Worker &$worker)
{
$this->worker = $worker;
}
public function changeStep(Step $step)
{
$this->worker->setStep($step);
$this->worker->incr();
}
abstract public function someJobs();
}
class FirstStep extends Step
{
abstract public function someJobs()
{
# code...
$step = new SecondStep($this->worker);
$this->changeStep($step)
# or...
$step = new OtherStep($this->worker);
$this->changeStep($step)
}
}
class SecondStep extends Step
{
public function someJobs()
{
# code...
$step = new OtherStep($this->worker);
$this->changeStep($step)
# or...
$step = new FirstStep($this->worker);
$this->changeStep($step)
}
}
В голову приходит еще singleton c pool'ом который непосредственно в шагах будет искать нужный worker и менять ему(worker'у) шаг, но тоже неприятно попахивает, пробежался по паттернам по диагонали, и ничего не увидел может кто, что подскажет?