Композитный образец и инъекция зависимостей

Я вижу, что композитный шаблон и зависимость от инъекций

public function __construct(ClassToUseInterface $class) { $this->class = $class } 

Итак, какая разница?

Related of "Композитный образец и инъекция зависимостей"

Код, представленный в вашем вопросе, не представляет собой инъекцию зависимостей и не представляет собой составной шаблон. Ваш код представляет собой так называемую инверсию зависимостей . Давайте ответим на ваш вопрос:

  1. Одним из способов для вашего кода действительно представлять Dependency injection является вызов функции construct из кода, который является внешним по отношению к классу, в котором определен метод construct , передавая ему конкретный объект, реализующий ClassToUseInterface . Говорят, что внешний код вводит зависимость, и поэтому он известен как Dependency injection .
  2. С другой стороны, составной шаблон (не путать с композицией) – это отношения, так что класс представляет собой как отношение IS-A и HAS-A одновременно с class или interface который он распространяет или реализует , Это позволяет группе объектов класса вести себя так, как если бы они представляли один объект класса.

Поскольку я не знаком с синтаксисом php , вот хороший пример Composite pattern в php . В этом примере метод draw в классе Container работает с группой объектов Graphic . Для вызывающего, как будто функция draw вызывалась на одном объекте Graphic .

В случае, если связанный пример не работает, вот код из ссылки (Dario Ocles, 18 июня 2007 г.)

 <?php abstract class Graphic{ abstract public function draw(); } class Triangle extends Graphic{ private $name = ''; public function __construct($name = 'unknown'){ $this->name = $name; } public function draw(){ echo '-I\'ma triangle '.$this->name.'.<br>'; } } class Container extends Graphic{ private $name = ''; private $container = array(); public function __construct($name = 'unknown'){ $this->name = $name; } public function draw(){ echo 'I\'ma container '.$this->name.'.<br>'; foreach($this->container as $graphic) $graphic->draw(); } public function add(Graphic $graphic){ $this->container[] = $graphic; } public function del(Graphic $graphic){ unset($this->container[$graphic]); } } $tri1 = new Triangle('1'); $tri2 = new Triangle('2'); $tri3 = new Triangle('3'); $container1 = new Container('1'); $container2 = new Container('2'); $container3 = new Container('3'); $container1->add($tri1); $container1->add($tri2); $container2->add($tri3); $container3->add($container1); $container3->add($container2); $container3->draw(); ?> с <?php abstract class Graphic{ abstract public function draw(); } class Triangle extends Graphic{ private $name = ''; public function __construct($name = 'unknown'){ $this->name = $name; } public function draw(){ echo '-I\'ma triangle '.$this->name.'.<br>'; } } class Container extends Graphic{ private $name = ''; private $container = array(); public function __construct($name = 'unknown'){ $this->name = $name; } public function draw(){ echo 'I\'ma container '.$this->name.'.<br>'; foreach($this->container as $graphic) $graphic->draw(); } public function add(Graphic $graphic){ $this->container[] = $graphic; } public function del(Graphic $graphic){ unset($this->container[$graphic]); } } $tri1 = new Triangle('1'); $tri2 = new Triangle('2'); $tri3 = new Triangle('3'); $container1 = new Container('1'); $container2 = new Container('2'); $container3 = new Container('3'); $container1->add($tri1); $container1->add($tri2); $container2->add($tri3); $container3->add($container1); $container3->add($container2); $container3->draw(); ?> 

В связанном / выше примере оператор $container3->add($container1); передает объект Container другому объекту Container . Это снова будет называться dependency injection . Отвлечься от этого является то, что dependency injection и composite pattern не означают одно и то же. composite объект может быть передан как dependency . composite объект – это не то же самое, что и dependency injection .

Отказ от ответственности : всякий кредит для вышеуказанной программы относится к ее оригинальным авторам.