2010-11-22 105 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() 
}