这是什么设计模式?

时间:2010-11-22 19:40:46

标签: php design-patterns

在过去的几天里,我一直在编写课程,起初我认为他们坚持使用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()

测试错误

到目前为止,这种模式对我来说一直很好。我知道设计模式的细节并不总是一成不变的,而且解决问题比担心语义更重要,但我对此真的很好奇,想知道我是否可以改进我的代码(或者,如果我以某种方式挖掘自己的坟墓)。

3 个答案:

答案 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()
}