Ступінь різниці між відповідями тут показує, чому це було б важко зрозуміти, але сказати так просто, як я можу описати:
Для того, щоб я знав, що якщо я кину м'ячик тобі, то ти можеш його спіймати, я дійсно не повинен знати, скільки тобі років. Мені не потрібно знати, що ти їв на сніданок, і мені справді все одно, хто твій перший розчарував. Все, що мені потрібно знати, це те, що ти можеш зловити. Якщо я знаю це, то мені байдуже, чи це ти, я кидаю м'яч тобі або твоєму братові.
За допомогою нединамічних мов, таких як c # або Java тощо, ми досягаємо цього за допомогою інтерфейсів. Тож скажемо, у нас є такий інтерфейс:
public ICatcher
{
public void Catch();
}
А тепер скажемо, що у нас є такі класи:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Тепер і CatcherA, і CatcherB реалізують метод Catch, тож сервіс, який вимагає Catcher, може використовувати будь-який із них, а не справді проклятий, який це. Таким чином, щільно пов'язана послуга може безпосередньо створити схоплений, тобто
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Таким чином, CatchService може робити саме те, що він вирішив зробити, але він використовує CatcherA і завжди буде користувачем CatcherA. Її важко закодовано, тому він залишається там, поки хтось не прийде і не відремонтує його.
Тепер давайте застосуємо інший варіант, який називається ін'єкцією залежності:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Таким чином, calss, який встановлює CatchService, може робити наступне:
CatchService catchService = new CatchService(new CatcherA());
або
CatchService catchService = new CatchService(new CatcherB());
Це означає, що служба Catch не є щільно пов'язаною ні з CatcherA, ні з CatcherB.
Існує декілька інших стратегій для невловимих служб зв'язку, як ця, наприклад, використання системи IoC тощо.