在过去的几天里,我一直在编写课程,起初我认为坚持Command设计模式,但是我已经对它们进行了修改,并且对它们真正匹配哪种模式感到好奇(如果有的话)。这是什么设计模式?
一个基本的例子是我用来查询Facebook API获取页面的提要的类。我的阶级是这样的:
class FetchPageFeedCommand extends Command {
public $feed;
private $pageId;
public function __construct($pageId) {
$this->pageId = $pageId;
}
public function execute() {
if ($feed = Facebook::api('/page/feed') /* psuedo code */) {
$this->feed = $feed;
return true;
} else {
return false;
}
}
}
然后,我会用类是这样的:
$com = new FetchPageFeedCommand(12345);
if ($com->execute()) {
$feed = $com->feed;
print_r($feed);
}
从我的理解,一个Command对象应该接收对象,我的没有。而且我的客户端和调用者似乎都是一样的。除此之外,我使用公共变量来处理有效载荷数据,而且我觉得这样做绝对不符合Command模式。
为了进一步弄清事情,我在Command超类中添加了一些功能,让我可以跟踪发生的错误。例如:
public function execute() {
if ($feed = Facebook::api('/page/feed') /* psuedo code */) {
$this->feed = $feed;
return true;
} else {
$this->addError('Could not fetch feed'); // Error management
return false;
}
我会再与$com->hasErrors()
和$com->getErrors()
到目前为止,这种模式一直运作良好,我测试错误。我知道设计模式的细节并不总是写得很好,解决问题比解决语义问题更重要,但我真的很好奇这一点,并希望看看我是否可以改进我的代码(或者如果我以某种方式挖掘自己的坟墓)。
尽量不要太挂在标签上。所有这些模式的设计目的都是为了让您更容易知道您第一次参加项目时或者您正在设计项目时对象的期望。我会说Command很接近。也许你应该给这个味道它是自己的名字?现场指挥?大声笑 – DampeS8N 2010-11-22 19:47:51