复合模式和依赖注入

时间:2015-05-09 05:33:19

标签: php design-patterns dependency-injection composite

我看到复合模式和依赖注入意味着

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

那么,差异是什么?

1 个答案:

答案 0 :(得分:2)

您的问题中提供的代码既不代表依赖注入,也不代表复合模式。您的代码代表所谓的Dependency inversion。让我们回答你的问题:

  1. 您的代码真正代表Dependency injection的一种方法是从定义construct方法的类外部的代码调用construct函数,并将其传递给具体实现ClassToUseInterface的对象。外部代码被称为注入依赖项,因此称为Dependency injection
  2. 另一方面,复合模式(不要与组合混淆)是一种关系,使得一个类同时代表IS-AHAS-A关系,classinterface关系它来自或实现的1}}或php。这允许类的一组对象表现得好像它们代表该类的单个对象。
  3. 由于我不熟悉Composite pattern语法,herephpdraw的一个很好的例子。在此示例中,Container类中的Graphic方法对一组draw个对象进行操作。对于调用者来说,好像在单个Graphic对象上调用了<?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(); ?> 函数。

    如果链接的示例不起作用,这里是链接的代码(Dario Ocles; 2007年6月18日)

    $container3->add($container1);

    在链接/上面的示例中,语句ContainerContainer对象传递给dependency injection的另一个对象。这将再次被称为dependency injection。从中可以看出composite patterncomposite并不意味着同一件事。 dependency对象可以作为composite传递。 dependency injection对象与order by不同。

    免责声明:上述计划的所有功劳都归原作者所有。