Я внедряю шаблон состояния в одном из моих проектов и сталкиваюсь с проблемой проектирования; мою проблему можно абстрактно описать следующим образом:
Допустим, у меня есть класс 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