复合模式和依赖注入

Composite pattern and Dependency Injection

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

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

所以,有什么区别?

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

  1. 您的代码真正表示 Dependency injection 的一种方法是从 class 外部的代码调用 construct 函数,其中 construct 方法是定义,传递给它一个实现 ClassToUseInterface 的具体对象。据说外部代码 注入 依赖项,因此称为 Dependency injection.
  2. 另一方面,复合模式(不要与组合混淆)是一种关系,class 表示两者,IS-AHAS-A 关系同时与它扩展或实现的 classinterface 一起使用。这允许 class 的一组对象表现得就像它们代表 class 的单个对象一样。

由于我不熟悉php语法,herephpComposite pattern的一个很好的例子。在此示例中,Container class 中的 draw 方法对一组 Graphic 对象进行操作。对于调用者来说,就好像 draw 函数是在单个 Graphic 对象上调用的。

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

<?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();
?>

在linked/above示例中,语句$container3->add($container1);将一个Container对象传递给Container的另一个对象。这将再次被称为 dependency injection。需要注意的是 dependency injectioncomposite pattern 不是同一回事。 composite 对象可以作为 dependency 传递。 composite 对象与 dependency injection.

不同

免责声明:上述程序的所有功劳归其原作者所有。