Stopień różnicy między odpowiedziami tutaj pokazuje, dlaczego byłoby to trudne do zrozumienia, ale mówiąc najprościej, jak mogę to opisać:
Żeby wiedzieć, że jeśli rzucę ci piłkę, to ty możesz ją złapać, naprawdę nie muszę wiedzieć, ile masz lat. Nie muszę wiedzieć, co jadłeś na śniadanie i naprawdę nie obchodzi mnie, kto był twoim pierwszym zakochanym. Muszę tylko wiedzieć, że możesz złapać. Jeśli to wiem, to nie obchodzi mnie, czy to ty, rzucam piłkę do ciebie lub twojego brata.
W przypadku języków niedynamicznych, takich jak C #, Java itp., Osiągamy to za pośrednictwem interfejsów. Powiedzmy, że mamy następujący interfejs:
public ICatcher
{
public void Catch();
}
A teraz powiedzmy, że mamy następujące klasy:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Teraz zarówno CatcherA, jak i CatcherB implementują metodę Catch, więc usługa, która wymaga Catcher, może używać jednego z nich i tak naprawdę nie obchodzi, która to jest. Tak więc ściśle powiązana usługa może bezpośrednio zainicjować przechwyconą tzw
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Tak więc CatchService może robić dokładnie to, co zaplanował, ale używa CatcherA i zawsze będzie używać CatcherA. Jest mocno zakodowany, więc pozostaje tam, dopóki ktoś nie przyjdzie i go nie przerobi.
Teraz weźmy inną opcję, zwaną iniekcją zależności:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Tak więc calss, które inicjują CatchService, mogą wykonać następujące czynności:
CatchService catchService = new CatchService(new CatcherA());
lub
CatchService catchService = new CatchService(new CatcherB());
Oznacza to, że usługa Catch nie jest ściśle powiązana z CatcherA ani CatcherB.
Istnieje kilka innych strategii dla luźnego łączenia usług, takich jak użycie frameworka IoC itp.