我正在我的一个项目中实现状态模式,并且遇到了设计问题;我的问题可以抽象地描述如下:
假设我有一个StatefulObject类,它具有一个保存CurrentState对象的state属性。
我希望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方法声明为protected。兄弟姐妹类可以访问PHP中相互受保护的方法 - 正如这里指出的那样 - http://www.php.net/manual/en/language.oop5.visibility.php#93743
答案 0 :(得分:0)
这个问题非常笼统,但我会根据我对你的问题的理解(这可能不是对问题的正确理解)来回答。
我建议您创建一个接口并在您的类中实现它,而不是使用该接口对象与方法进行交互。
答案 1 :(得分:0)
如果你的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.
}
}