Внедрение зависимости просто означает, что вместо того, чтобы класс, решающий, какие объекты ему нужны для работы, он получает эти объекты извне.
При нормальной разработке наши объекты определяют свои классы конкретно, как это:
public class MyClass
{
private var m_someObj:SomeObj = null;
public function MyClass()
{
this.m_someObj = new SomeObj;
}
}
Переходя к инъекции зависимостей, MyClass
теперь получает свои зависимости от внешнего:
public class MyClass
{
private var m_someObj:SomeObj = null;
public function MyClass( obj:SomeObj ):void
{
this.m_someObj = obj;
}
}
var myClass:MyClass = new MyClass( new SomeObj );
В этом примере мы передаем класс SomeObj
при построении MyClass
. Вы также можете использовать публичные переменные / свойства либо. Передача объектов через конструктор полезна для жизненно важных зависимостей.
Теперь, чтобы сделать это действительно полезным, мы можем использовать интерфейсы вместо конкретных классов. Это позволяет нам легко изменить поведение MyClass
:
public interface ISomeObj
{
}
public class SomeObjImplA implements ISomeObj
{
}
public class SomeObjImplB implements ISomeObj
{
}
public class MyClass
{
private var m_someObj:ISomeObj = null;
public function MyClass( obj:ISomeObj ):void
{
this.m_someObj = obj;
}
}
var myClass1:MyClass = new MyClass( new SomeObjImplA );
var myClass2:MyClass = new MyClass( new SomeObjImplB );
Чтобы привести пример, интерфейс ISomeObj
может описывать рендерер. Класс SomeObjImplA
будет отображаться с использованием обычных методов addChild()
, а класс SomeObjImplB
- с использованием блитинга. Теперь вы можете изменить способ визуализации объекта MyClass
, просто изменив параметр - классу MyClass
не нужно знать, отображается ли он нормально или с помощью блиттинга.
Объект, который решает, какой класс передать MyClass
, называется инжектором . Как он решает, какой класс вводить, где вы получаете гибкость. Например, вы можете загрузить объект XML, который содержит классы для внедрения, или использовать отражение, как я думаю. Robotlegs работает.
Ссылка, которую разместила 32bitkid, является довольно хорошим объяснением принципа, но в этом суть. Вы также можете проверить вики-страницу . Для получения бонусных очков читайте о Inversion of Control , что несколько связано.