在过去的几天里,我一直在编写课程,起初我认为他们坚持使用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超类添加了一些功能,让我跟踪发生的错误。例如:
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()
到目前为止,这种模式对我来说一直很好。我知道设计模式的细节并不总是一成不变的,而且解决问题比担心语义更重要,但我对此真的很好奇,想知道我是否可以改进我的代码(或者,如果我以某种方式挖掘自己的坟墓)。
答案 0 :(得分:3)
对我来说看起来像Command模式。客户端是创建Command的人,发起者是调用execute方法的人,接收者是实现执行的人。
仅仅因为客户端和启动器在您的实例中是相同的,似乎并没有改变我的模式。我认为重要的是你创建命令传递构造函数中的参数或通过设置属性。稍后通过调用命令接口的execute方法,该命令可以由其他一些对象(引导器)执行 - 它不需要知道该阶段的参数。
答案 1 :(得分:1)
对我来说,它看起来有点像战略模式的开端。
答案 2 :(得分:1)
命令模式对于延迟执行很有用,可以使用独立于其创建或位置的参数进行调用。
可能更适合您的是facade pattern。
示例:
class MyFacebookApi {
function __construct(Facebook $fb)
function getFeed()
function sendWallpost($msg)
function getError()
}