媒体经理:我怎样才能改进我的设计?

时间:2016-10-14 14:53:04

标签: php design-patterns

我正在培养媒体经理。该管理器可以处理各种媒体类型,如音频,视频和图像。主要功能是调整媒体大小,显然每个媒体类型的过程都不同。

以下是我现在所拥有的:

  • 实体Media,其中包含有关它的各种数据(文件名,路径...)
  • 实用程序类MediaResizer,可以处理各种类型的媒体文件。

媒体实体:

class Media {

    public $originalFile;
    public $resizedFile;

    public function resize($size) {
        $resizer = new MediaResizer($this->originalFile);
        $this->resizedFile = $resizer->resize($size)
    }
}

媒体缩放器:

class MediaResizer {

    public $file;
    public function getFileType(){/**/} // returns audio, video or image

    function resize($size) {
        $type = $this->getFileType();
        $method = 'resize' . ucfirst($type);
        return $this->$method($size)
    }

    private function resizeVideo(){/**/}
    private function resizeImage(){/**/}
    private function resizeAudio(){/**/}
}

正如您所看到的,媒体不知道实际调用哪个方法来调整文件大小。

这就是我想要的:

使用此代码,一切正常。但是,我的mediaResizer类太大了,所以我决定把它分成4个类:

  • 包含所有常用代码的抽象媒体缩放器
  • 一个VideoResizer,一个ImageResizer和一个AudioResizer,ann三扩展了抽象类。

我现在遇到的问题是如何根据缩放器类中的媒体类型继续选择缩放器类的过程?

这是我的想法,但我不喜欢依赖他的孩子的课程的想法:

class Media{
    function resize($size){
        $resizerClass = MediaResizer::getResizerClass($filetype); // returns ImageResizer, VideoResizer or AudioResizer
        $resizer = new $resizerClass($file);
        $resizer->resize($size);
    }
}

在实体中使用这样的东西是个好主意还是有更好的方法来做同样的事情?

1 个答案:

答案 0 :(得分:1)

  

我不喜欢依靠他的孩子的课程的想法

是的,你是对的! MediaResizer应该足够抽象,因此不得了解VideoResizerAudioResizer ...

等详细信息

但解决方案很简单,只需将创建缩放器的工作转移到新的类Factory

class Factory {
    public function createResizer($type) {
        // based on $type and then
        // return new VideoResizer() or new AudioResizer() ...
    }
}

class Media {
    public function resize($size){
        Factory::createResizer($this->type())->resize($size);
    }
    public function type() { // this method should be in this class
        // returns audio, video or image
    }
}