Я видим, что Композитная модель и нагнетательная зависимость означаютКомпозитные модели и Dependency Injection
public function __construct(ClassToUseInterface $class) {
$this->class = $class
}
Итак, в чем разница?
Я видим, что Композитная модель и нагнетательная зависимость означаютКомпозитные модели и Dependency Injection
public function __construct(ClassToUseInterface $class) {
$this->class = $class
}
Итак, в чем разница?
Код, представленный в вашем вопросе, не представляет собой инъекцию зависимостей и не представляет собой составной шаблон. Ваш код представляет собой то, что известно как Dependency inversion. Давайте ответим на ваш вопрос:
Dependency injection
является вызовом construct
функции из кода, который является внешним по отношению к классу, в котором определен метод construct
, передавая ему конкретный объект, который реализует ClassToUseInterface
, Внешний код называется впрыском, и поэтому он известен как Dependency injection
.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
.
Отказ от ответственности: Все кредиты на вышеуказанную программу предоставлены авторам.
Вы читали статьи в Википедии [Композитный шаблон] (https://en.wikipedia.org/wiki/Composite_pattern) и [Инъекция зависимостей] (https://en.wikipedia.org/wiki/Dependency_injection) , Можете ли вы объяснить нам, что вы не понимаете об этих шаблонах и их отношениях после прочтения этих статей? – Steven
@Steven Я считаю, что OP путает композицию с инъекцией зависимости. Независимо от этого, мой ответ пытается прояснить любые сомнения в том, что ОП может иметь о двух принципах проектирования. Дайте мне знать, как я могу улучшить свой ответ. – CKing