用于减少同一对象的不同类型集合中的代码重复的设计模式

时间:2011-09-14 15:03:45

标签: php oop design-patterns redis

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

每当创建照片时,它都会添加到缓存中的文件夹和相册中。因为将代码添加到缓存中的代码相同,并且只有缓存键发生更改,所以会生成一个名为CachedImageSet的单独对象。该文件夹和相册使用其唯一ID和集合类型实例化CachedImageSet,并且它们调用CachedImageSet来添加和删除图像并获取集合中的图像列表。

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

2 个答案:

答案 0 :(得分: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('....');

答案 1 :(得分:-2)

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