«Программа для интерфейса» означает, что не зависит от конкретного типа для выполнения вашей работы , но он не определяет, как вы должны получить свою зависимость.
«Принцип инверсии зависимостей» говорит, что объект не должен контролировать создание своих зависимостей, он должен просто объявлять, какая зависимость ему нужна, и позволить вызывающей стороне предоставить ее . Но это не указывает, должна ли зависимость быть конкретным типом или интерфейсом.
Я проиллюстрирую различия с помощью некоторого кода на C #.
Следующий пример зависит от конкретного типа и управляет созданием собственной зависимости. Это не следует ни за «программой к интерфейсу», ни «инверсией зависимостей»:
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Следующий пример зависит от интерфейса, но он контролирует создание собственной зависимости. Это следует за «программой к интерфейсу», но не «инверсией зависимости»:
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Следующий пример зависит от конкретного типа, но запрашивает, чтобы его зависимость была создана и передана ему. Это следует за "инверсией зависимости", но не "программой к интерфейсу":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Следующий пример зависит от интерфейса и запрашивает, чтобы его зависимость была создана и передана ему. Это следует за "инверсией зависимости" и "программой к интерфейсу":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}