Степень различия между ответами здесь показывает, почему эту концепцию было бы трудно понять, но, если выразить ее так просто, как я могу ее описать:
Чтобы я знал, что если я брошу тебе мяч, ты сможешь его поймать, мне действительно не нужно знать, сколько тебе лет. Мне не нужно знать, что вы ели на завтрак, и мне действительно все равно, кто был вашей первой любовью. Все, что мне нужно знать, это то, что ты можешь поймать. Если я это знаю, то меня не волнует, если это ты, я кидаю мяч тебе или твоему брату.
С нединамическими языками, такими как 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();
}
}
Таким образом, вызовы, которые создают экземпляр CatchService
, могут делать следующее:
CatchService catchService = new CatchService(new CatcherA());
or
CatchService catchService = new CatchService(new CatcherB());
Это означает, что служба Catch
не тесно связана ни с CatcherA
, ни с CatcherB
.
Есть несколько других стратегий для слабого связывания таких сервисов, как использование инфраструктуры IoC и т. Д.
person
Owen
schedule
22.10.2008