州/战略模式 - 可见性问题

时间:2011-09-07 21:32:23

标签: php design-patterns

我正在我的一个项目中实现状态模式,并且遇到了设计问题;我的问题可以抽象地描述如下:

假设我有一个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

2 个答案:

答案 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. 
    }
}