当命令更新接收器的私有属性时,调用者应该在哪里放置Command设计模式?

时间:2015-11-20 15:01:40

标签: php design-patterns command

我给自己练习了解Command设计模式。我为Placeable,Placer和Placement创建了接口,其中的想法是Placer将使用Placement命令来更改Placeable。我使用简单的x,y值作为场所值。 Placeable中的X和y是私有的。 (不应该是吗?否则任何事情都可能改变位置。)正如你在下面的代码中看到的那样,我的“调用者”最终进入了“接收者”。这看起来不像我在网上找到的例子。像这样https://en.wikipedia.org/wiki/Command_pattern#Java。但是,这些示例使用公共属性。我的运动中有没有做错的事情?另外,在封装方面,不是使用公共属性不好的例子吗?如果有什么东西可以访问公共财产或方法,那么命令设计有什么意义?

<?php 

// receiver
interface Placeable
{
    public function locate();

    public function toPlace(Placement $placement);
}

// client
interface Placer
{
    public function place(Placeable $placeable, $x=0, $y=0);
}

// command
interface Placement
{
    public function setX($x=0);

    public function setY($y=0);

    public function getX();

    public function getY();
}

///////////////////////////////////////////////////////////////////////

// receiver
class Book implements Placeable
{
    private $x = 0;
    private $y = 0;

    public function locate()
    {
        return '(' . $this->x . ',' . $this->y . ')';
    }

    // invoker is inside the receiver, because the command changes private properties
    public function toPlace(Placement $placement)
    {
        $this->x = $placement->getX();
        $this->y = $placement->getY();
    }
}

// command
class PlacementCommand implements Placement
{
    private $x = 0;
    private $y = 0;

    public function setX($x=0)
    {
        $this->x = $x;
    }

    public function setY($y=0)
    {
        $this->y = $y;
    }

    public function getX()
    {
        return $this->x;
    }

    public function getY()
    {
        return $this->y;
    }
}

// client
class Person implements Placer
{
    public function place(Placeable $placeable, $x=0, $y=0)
    {
        $placement_command = new PlacementCommand();
        $placement_command->setX($x);
        $placement_command->setY($y);
        $placeable->toPlace($placement_command);
    }
}
?>
<pre>
<?php 
$book = new Book();
$person = new Person();
$person->place($book, 3, 4);
//
echo var_dump($book);
?>
</pre>

0 个答案:

没有答案