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个类:
我现在遇到的问题是如何根据缩放器类中的媒体类型继续选择缩放器类的过程?
这是我的想法,但我不喜欢依赖他的孩子的课程的想法:
class Media{
function resize($size){
$resizerClass = MediaResizer::getResizerClass($filetype); // returns ImageResizer, VideoResizer or AudioResizer
$resizer = new $resizerClass($file);
$resizer->resize($size);
}
}
在实体中使用这样的东西是个好主意还是有更好的方法来做同样的事情?
答案 0 :(得分:1)
我不喜欢依靠他的孩子的课程的想法
是的,你是对的! MediaResizer
应该足够抽象,因此不得了解VideoResizer
,AudioResizer
...
但解决方案很简单,只需将创建缩放器的工作转移到新的类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
}
}