2015-05-09 6 views
2

Я видим, что Композитная модель и нагнетательная зависимость означаютКомпозитные модели и Dependency Injection

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

Итак, в чем разница?

+0

Вы читали статьи в Википедии [Композитный шаблон] (https://en.wikipedia.org/wiki/Composite_pattern) и [Инъекция зависимостей] (https://en.wikipedia.org/wiki/Dependency_injection) , Можете ли вы объяснить нам, что вы не понимаете об этих шаблонах и их отношениях после прочтения этих статей? – Steven

+1

@Steven Я считаю, что OP путает композицию с инъекцией зависимости. Независимо от этого, мой ответ пытается прояснить любые сомнения в том, что ОП может иметь о двух принципах проектирования. Дайте мне знать, как я могу улучшить свой ответ. – CKing

ответ

2

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

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

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

В случае связанный пример не работает, вот код из ссылки (Дарио 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\'m a 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\'m a 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. A composite объект - это не то же самое, что и dependency injection.

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