2010-11-22 120 views
3

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

到目前为止,这种模式一直运作良好,我测试错误。我知道设计模式的细节并不总是写得很好,解决问题比解决语义问题更重要,但我真的很好奇这一点,并希望看看我是否可以改进我的代码(或者如果我以某种方式挖掘自己的坟墓)。

+3

尽量不要太挂在标签上。所有这些模式的设计目的都是为了让您更容易知道您第一次参加项目时或者您正在设计项目时对象的期望。我会说Command很接近。也许你应该给这个味道它是自己的名字?现场指挥?大声笑 – DampeS8N 2010-11-22 19:47:51

回答

3

看起来像命令模式给我。客户端是创建Command的人,发起者是调用execute方法的人,接收者是执行execute的人。

仅仅因为您的实例中的客户端和启动器相同,似乎并未改变我的模式。我认为最重要的部分是您创建传递构造函数中的参数或通过设置属性的命令。该命令稍后可以通过调用命令接口的execute方法由其他某个对象(intitiator)执行 - 它不需要知道该阶段的参数。

1

它看起来有点像我战略模式的开始。

1

命令模式对于延迟执行很有用,可以使用独立于其创建或位置的参数进行调用。

什么可能更适合你是facade pattern

例子:


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