O grau de diferença entre as respostas aqui mostra por que seria um conceito difícil de entender, mas colocá-lo da maneira mais simples possível:
Para que eu saiba que, se eu jogar uma bola para você, você pode pegá-la, eu realmente não preciso saber quantos anos você tem. Não preciso saber o que você comeu no café da manhã, e realmente não me importo com quem foi sua primeira paixão. Tudo o que preciso saber é que você pode pegar. Se eu sei disso, então não me importo se é você Eu estou jogando uma bola para você ou seu irmão.
Com linguagens não dinâmicas como c # ou Java etc, realizamos isso por meio de interfaces. Então, digamos que temos a seguinte interface:
public ICatcher
{
public void Catch();
}
E agora vamos dizer que temos as seguintes classes:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Agora, tanto o CatcherA quanto o CatcherB implementam o método Catch, para que o serviço que requer um Catcher possa usar um desses e não dar a mínima para qual deles é. Portanto, um serviço fortemente associado pode instanciar diretamente um
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Portanto, o CatchService pode fazer exatamente o que se propôs a fazer, mas usa o CatcherA e sempre utilizará o CatcherA. É codificado, então fica lá até alguém aparecer e refatorá-lo.
Agora vamos usar outra opção, chamada injeção de dependência:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Portanto, as mensagens que instansiam o CatchService podem fazer o seguinte:
CatchService catchService = new CatchService(new CatcherA());
ou
CatchService catchService = new CatchService(new CatcherB());
Isso significa que o serviço Catch não está totalmente acoplado ao CatcherA ou CatcherB.
Existem várias outras estratégias para serviços de acoplamento frouxo como este, como o uso de uma estrutura de IoC etc.