Архитектура модуля для обработки изображений

Xeon303

Новичок
Alexandre
Потому что с какой библиотекой работать определяет класс ImageManager, он то получает объект нужного хэндлера (либо GD, либо IMagick). При работе с абстрактным слоем, приложение использующее его не должно вообще знать каким обработчиком будет изменяться изображение.

Приложение знает только об абстрактных классах Image_Filter, но когда система внутри опрделит, то нужны будут не абстрактные объекты класса Image_Filter, а специализированные - под конкретную библиотеку, например, Image_Filter_GD. Но вопрос в том, что это нужно сделать тогда, когда уже существует объект Image_Filter с определенными свойствами.

-~{}~ 23.04.09 20:13:

Даже не знаю... либо действительно плюнуть на эти фильтры, а оставить только обработчики, либо пусть работает как есть, но тут никак не получается наследовать класс Image_Filter_GD_Crop, от того же Image_Filter_Crop.
 

john.brown

просто кулибин
Xeon303
Вы скажете, что нужно было наследовать Image_Filter_IMagickShell_Resize от Image_Filter_Resize?
А зачем тут вообще наследование? Используй делегирование - имхо, тут сам бог велел...
Я это вижу примерно так:
PHP:
class Image {
	...
	function apply($filters) {
		$filters->apply($this->image, $this->libHandler);
	}
}
class FiltersChain {
	$this->filters = array();
	
	function add($filter) {
		$this->filters[] = $filter;
		return $this;
	}
	function apply($image, $lib) {
		foreach($this->filters as $filter) {
			$concreteFilterName = get_class($filter).$lib->name();
			if(class_exists($concreteFilterName)) {
				$concreteFilter = new $concreteFilterName($lib, $filter);
				$concreteFilter->apply($image);
			} 
		}
	}
}
class AbstractFilter {
	private $params = array();
	
	function __set($key, $val) {
		$this->params[$key] = $val;
	}
	function __get($key) {
		return $this->params[$key];
	}
}
class FilterColor extends AbstractFilter {
	function __construct($r, $g, $b) {
		$this->params['R'] = $r;
		$this->params['G'] = $g;
		$this->params['B'] = $b;
	}
}

$image = new Image();
$image->load('path/to/image.jpg');
$filters = new FiltersChain();
$filters->add(new FilterColor(255,255,255))->add(new FilterResize($width, $height); 
$image->apply($filters);
$image->save();
 

Alexandre

PHPПенсионер
Xeon303 будь проще, сложно само получится

Вот пример кода фабрики:
PHP:
 $db= DB:getInstance('Mysql');
$db->connect( $login, $psw, $host,  $port);
$db->query('select * from users');
 

admLoki

Новичок
john.brown
Это не делегация, это контекс-паттерн.
Но я бы сделал точно так-же или примерно так-же.
 
Сверху