2012-10-29 52 views
0

我需要創建一個多態對象的系統。如何從特定的類或屬性中選擇定義的類型?

每種類型的對象都應該由特定的處理程序來處理,因此我需要確定哪些類型可以正確處理。

我想知道什麼是最好的設計決定:

  • 創建一個抽象基類像ObjectBase,然後擴展到特定 對象,像CustomObjectACustomObjectB

  • 創建通用對象GenericObject和使用$type屬性傳遞給構造函數(type應該是不可變的)。

注意對象沒有什麼不同,只是他們的處理方式,我的意思是,有沒有添加屬性或方法或任何他們的行爲。

任何反饋?


編輯:

首先解決

abstract class ObjectBase {} 


class CustomObjectA extends ObjectBase {} 

class HandlerManager { 
    public function process(ObjectBase $object) { 
      if ($object instanceof CustomObjectA) { 

       $customObjectAHandler->process($object); 
      } 
    } 
} 

解決方法二

class GenericObject { 
    protected $type; 

    public function __construct($type) 
    { 
     $this->type = $type; 
    } 
} 

class ObjectTypeAHandler { 
    public function process(GenericObject) { 
    } 

    public function supportsType(GenericObject $object) 
    { 
     return 'typeA' === $object->getType(); 
    } 
} 

    class HandlerManager { 
     public function process(GenericObject $object) { 
      if ($customObjectAHandler->supportType($object)) { 
       $customObjectAHandler->process($object); 
      } 
     } 
    } 

回答

0

讓所有處理器共享一個基類。讓對象使用基類上抽象的工廠方法創建正確的處理程序。

+0

我不認爲處理程序應該設置在對象級別,它應該知道它的處理程序,它是針對很多OOP規則(見SOLID)Imho – Trent

+0

我認爲我不清楚:我的建議是抽象工廠模式的變體,只有對象也扮演抽象工廠的角色。 –

0

我會建議你第一種方式。創建2個沒有主體的對象並不難,但如果你想在未來改變他們的行爲 - 你將有事情做完。

+0

順便說一下,沒有理由改變行爲,第二種解決方案不禁止擴展對象來進行自定義,因爲基類將始終匹配 – Trent

相關問題