我给自己练习了解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>