【问题标题】:Design pattern for reducing code duplication in different types of collections of the same object用于减少同一对象的不同类型集合中的代码重复的设计模式
【发布时间】:2011-09-14 15:03:45
【问题描述】:

假设我有一个定义图像对象的类。图片可以属于相册,相册可以属于文件夹。此数据存储在 MySQL 中。数据也被缓存。在缓存中,它以非规范化的形式存储,即文件夹跟踪与其关联的图像,相册也是如此。这是出于性能原因而实施的。

现在无论何时创建照片,它都会同时添加到缓存中的文件夹和相册中。因为将照片添加到缓存中的代码相同,并且只有缓存键发生变化,所以创建了一个名为 CachedImageSet 的单独对象。文件夹和相册实例化 CachedImageSet 及其唯一的 id 和集合的类型,它们调用 CachedImageSet 来添加和删除图像并获取集合中的图像列表。

我不希望客户端代码直接与 CachedImageSet 交互,因此我在文件夹和相册类中有方法,它们是 CachedImageSet 方法的包装器。这会导致大量代码重复。是否有任何设计模式可以帮助我摆脱这种重复?我正在使用 PHP、MySQL 和 Redis(用于缓存层)。

【问题讨论】:

    标签: php oop design-patterns redis


    【解决方案1】:

    我可能有点离题,但如果我正确解释了您的问题,我会使用工厂模式。

    类似这样的东西(当然是简化的):

    <?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('....');
    

    【讨论】:

      【解决方案2】:

      MVC在我看来是一个非常好的设计模式,但我认为你应该选择最适合你的,适合你自己在维基百科(设计模式)

      【讨论】:

      • 我正在使用 MVC... 我不希望控制器使用 CachedPostSet。专辑和文件夹的模型具有访问 CachedPostSet 的包装器。
      • 我不知道该建议你使用什么,但我认为你必须测试你自己,看看什么最适合你,en.wikipedia.org/wiki/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多