Модель состояния / стратегии - проблема видимости - PullRequest
0 голосов
/ 08 сентября 2011

Я внедряю шаблон состояния в одном из моих проектов и сталкиваюсь с проблемой проектирования; мою проблему можно абстрактно описать следующим образом:

Допустим, у меня есть класс StatefulObject, у которого есть свойство состояния, которое содержит объект CurrentState.

Большая часть функционально необходимого мне объекта CurrentState инкапсулирована в объекте StatefulObject.

Проблема в том, что разрешение доступа к этой функции вынуждает меня предоставлять открытые методы в классе StatefulObject, которые в противном случае я бы не представил, а также считаю, что не должен.

Я бы приветствовал предложения по решению этой проблемы с видимостью.

Язык реализации - PHP, если это имеет значение.

Я собрал пример кода, согласно запросу:

Class StatefulObject{

    protected $state;

    public function StatefulObject(){
        $this->state = new PrepareSate($this);
    }

    public function execute(){
        $this->state->execute();
    }

    /* I am not intrested in providing public access to these methods
    Optimaly I would have this visible only for the PrepareState*/
    public function setX(){

    };
    public function setY(){

    };  
}

Abstract class StateObject{
    protected $stateFulObjectRef;

    public function StateObject(StateFulObject $ref){
        $this->stateFulObjectRef = $ref;
    }
}

 Class PrepareState extends StateObject{
    public function execute(){
        /* This is why I need the public access for */
         $this->stateFulObjectRef->setX();
         $this->stateFulObjectRef->setY();
    }
}

Я думаю, что решение в Java будет иметь методы setX setY без модификатора доступа, что означает, что они будут видны на уровне пакета.

Я не думаю, что PHP имеет эквивалентное решение.

РЕДАКТИРОВАТЬ, на возможный ответ:

Я думаю, что лучшее решение, которое я придумала до сих пор, это сделать StatefulObject и StateObject наследовать одного и того же отца (исключительно для наглядности). и объявить методы setX setY как защищенные. Родственные классы имеют доступ друг к другу защищенными методами в PHP - как указано здесь - http://www.php.net/manual/en/language.oop5.visibility.php#93743

Ответы [ 2 ]

0 голосов
/ 19 марта 2014

Если вашему StateObject вообще не нужен доступ к StatefulObject, просто передайте необходимые значения в параметрах (шаблон стратегии).

Class StatefulObject{

    protected $state;

    public function StatefulObject(){
        $this->state = new PrepareSate($this);
    }

    public function execute(){
        $this->state->execute($this->x, $this->y);
    }

}

Class PrepareState extends StateObject{
    public function execute($x, $y){
        // Now you have access to $x and $y. 
    }
}
0 голосов
/ 08 сентября 2011

Вопрос очень общий, но я постараюсь ответить, основываясь на моем понимании вашей проблемы (что может быть неверным пониманием проблемы)

Я предложу вам сделать интерфейс и реализовать егов вашем классе, а затем использовать этот интерфейсный объект для взаимодействия с методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...