2012-01-13 128 views
2

我正在嘗試確定一個系統的設計,這意味着可以提供很高的可擴展性。從我所知道的情況來看,抽象工廠等模式除了重複代碼(如下所示)外,不允許重寫基本方法。模塊化設計模式

我已經做了面向方面編程的一些初步研究,它似乎是沿着我正在尋找的線,但我有一個困難的時間包圍我的頭周圍的具體情況。

abstract class Object { 

    protected $object_id; 
    protected $name; 

    function LoadObjectData() 
    { 
     $file_contents = readfile('object'.$object_id.'.data'); 
     $data = array(); 
     // parse file contents into $data array... 
     return $data; 
    } 

    function Create() 
    { 
     $data = $this->LoadObjectData(); 
     $name = $data['name']; 
     return $data; 
    } 

} 

class User extends Object { 

    protected $email_address; 

    function Create() 
    { 
     $data = parent::Create(); 
     $this->email_address = $data['email_address']; 
     return $data; 
    } 

} 

//----------Module 1-MySQL Lookup------------- 
/* 
* Redefine Object::LoadObjectData() as follows: 
*/ 

function LoadObjectData() 
{ 
    $data = array(); 
    $result = mysql_query("SELECT..."); 
    // construct array from result set 
    return $data; 
} 

//----------Module 2-Cache Machine------------- 
/* 
* Redefine Object::LoadObjectData() as follows: 
*/ 

function LoadObjectData() 
{ 
    if (exists_in_cache($object_id)) { 
     return get_cached_object($object_id); 
    } 
    $data = parent::LoadObjectData(); 
    cache_object($object_id, $data); 
    return $data; 
} 

(這是不大不小的壞榜樣的,但希望它有助於獲得跨越我的觀點)

的對象系統將有可用的方法非常大的比例進行擴展,我想盡量減少開發人員的額外工作量和學習時間。

AOP究竟是我正在尋找的,還是有更好的方法來處理這個問題?

謝謝!

回答

-1

您不必將基類聲明爲抽象類。你可以使它成爲一個普通的類,並根據傳遞的構造參數來加載和實例化其他類。構造函數可以返回一個類的實例,而不僅僅是構造函數所在的類。爲了避免重複代碼,可以將靜態和實例化的函數和變量混合使用。請記住,所有實例的靜態函數或變量都是相同的。將一個靜態變量更改爲一個,並對所有實例更改。插件架構的一個相當基本的例子。

class BaseObject { 
    protected static $cache = array(); 

    public function __construct($load_plugin) { 
     require_once($load_plugin.'.class.php'); 
     $object = new $load_plugin(); 
     return $object; 
    } 

    public static function cacheData($cache_key, $data) { 
     self::$cache[$cache_key] = $data; 
    } 
} 

class Plugin extends BaseObject { 
    public function __construct() { 
    } 

    public function loadData() { 
     // Check the cache first 
     if (!isset(self::$cache[$cache_key])) { 
      // Load the data into cache 
      $data = 'data to cache'; 
      self::cacheData($cache_key, $data); 
     } 
     return self::$cache[$cache_key]; 
    } 
} 
+0

在這個例子中,緩存的意圖或從數據庫加載的意圖是設計的。但是,我們假設另一個開發人員已經開發了模塊(模塊1和模塊2)以修改原始程序流程。是的,實際上一個設計良好的應用程序將包含一個本地緩存,但這僅僅是一個例子。你的方法很有趣,但不允許多個擴展,也不回答與現有設計模式有關的問題。不過謝謝。 – Godwin 2012-01-14 03:25:03

+0

它允許無限的擴展。只需傳遞要加載的擴展名,基類將加載它,創建它的一個實例並返回實例。像這樣的設計允許所有的擴展/插件由基類(工廠)管理,如果需要的話,強制所有的擴展單元都是單例。插件可能會重載基類中的任何方法,這會修改基類的行爲。 – 2012-01-14 23:31:18