2011-09-14 31 views
2

假設我有一個定義圖像對象的類。該圖像可以屬於一個相冊,並且該相冊可以屬於一個文件夾。這些數據存儲在MySQL中。數據也被緩存。在緩存中,它以非規範化的形式存儲,即文件夾保持跟蹤它們相關的圖像,並且相冊也是如此。這是出於性能原因而實施的。用於減少同一對象的不同類型集合中代碼重複的設計模式

無論何時現在創建照片,它都將被添加到緩存中的文件夾和相冊中。由於將代碼添加到緩存的代碼相同,只有緩存鍵發生更改,因此會創建一個名爲CachedImageSet的單獨對象。該文件夾和相冊使用它們的唯一ID和集合類型實例化CachedImageSet,並且它們調用CachedImageSet來添加和刪除圖像並獲取集合中的圖像列表。

我不希望客戶端代碼直接與CachedImageSet交互,所以我在CachedImageSet的方法的包裝文件夾和相冊類中有方法。這導致很多代碼重複。有沒有什麼設計模式可以幫助我擺脫這種重複?我使用PHP,MySQL和Redis(用於緩存層)。

回答

-2

MVC在我看來是一個非常好的設計模式,但我認爲你應該選擇最適合你,適合你自己在維基百科的一個(設計模式)

+0

我使用MVC ......我不想控制器使用CachedPostSet。相冊和文件夾的模型具有訪問CachedPostSet的包裝器。 – tabdulla

+0

我不知道建議你使用什麼,但我認爲你必須測試自己,看看最適合你的是什麼,http://en.wikipedia.org/wiki/Design_pattern_(computer_science)#Classification_and_list – SAFAD

0

我可能是大錯特錯,但如果我正確解釋你的問題,我會使用工廠模式。

像這樣的東西(這是簡化當然):

<?php 

abstract class Folder { 

    public static function factory($driver = 'Database') 
    { 
     $class = 'Folder_'.str_replace('/', '_', $driver); 

     return new $class(); 
    } 

} 

class Folder_Database { 

    public function get() { 
     // Fetch folder from database 
    } 

    public function save() { 
     // Save folder to database 
    } 

} 

class Folder_Cache { 

    public function get() { 
     // Fetch folder from Redis 
    } 

    public function save() { 
     // Save folder to Redis 
    } 

} 

// Usage: 
$folder = Folder::factory('Cache'); 
$folder->save('....');