Graid
@Graid

Выбор паттерна или как сделать?

Есть 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'у) шаг, но тоже неприятно попахивает, пробежался по паттернам по диагонали, и ничего не увидел может кто, что подскажет?
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
factory + chain of responsibility
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы