这是什么设计模式?

3

近几天,我一直在编写类,起初我认为它们符合命令设计模式,但现在我已经对它们进行了修改,并且好奇它们实际上匹配哪种模式(如果有的话)。

一个基本例子是我正在使用的类,用于查询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);
}

据我所知,一个命令对象应该带有一个接收者对象,但我的命令对象没有。而且我的客户端和调用者似乎是同一个对象。再加上我使用公共变量来传输有效负载数据,我觉得这明显不符合命令模式的要求。

更让事情变得混乱的是,我在命令超类中添加了一些功能,可以让我跟踪发生的错误。例如:

    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
不要太纠结于标签。所有这些模式都是为了使您在第一次接触项目或进行架构设计时更容易知道要从对象中期望什么而设计的。我会说Command已经足够接近了。也许你应该给这种味道起一个自己的名字?田野指挥?哈哈 - DampeS8N
3
古代智慧说,首先你必须学习模式,然后你必须忘记模式,这时你才开始成为真正的大师。 - Bill Yang
@Bill Yang - 啊,非常禅。我喜欢它。 - Steven Mercatante
3个回答

3
看起来对我来说是命令模式。客户端创建命令,发起者调用执行方法,接收者实现执行。即使在您的实例中客户端和发起者是相同的,但对我来说似乎并没有改变模式。我认为重要的部分是通过构造函数或设置属性传递参数来创建命令。稍后可以通过调用命令接口的执行方法来执行命令,这样其他对象(发起者)就不需要在那个阶段知道参数。

1

在我看来,它有点像策略模式的开端。


1

命令模式对于延迟执行很有用,可调用与其创建或位置无关的参数。

对你来说可能更适合的是外观模式

示例:


class MyFacebookApi {
  function __construct(Facebook $fb)
  function getFeed()
  function sendWallpost($msg)
  function getError()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接