Coesão e Acoplamento - Exemplos

Comecei a estagiar faz pouco tempo, e me chamaram a atenção sobre duas coisas: coesão e acoplamento.
Num mundo perfeito teríamos alta coesão e o baixo acoplamento certo?
Consegui entender sobre alta coesão, segue um exemplo de como não se deve fazer:

public class Produto
{
	public void venderProduto()
	{
	
	}

	public void imprimirEstoque()
	{

	}
		
	public void reporProduto()
	{

	}
}

Entendi sobre acoplamento tb, e como se medir! Mas alguém poderia postar um exemplo simples de alto acoplamento?

[code]public class GerenciaProduto{

private FechaConta fechaConta;
private Carrinho carrinho;

public GerenciaProduto(){    
    carrinho = new Carrinho();
}

public void executa(Produto produto){
    new FechaConta(carrinho).finaliza(produto);    
}

}
[/code]

Repare que se o meu carrinho precisar de um usuário logado eu acabo quebrando o código e mais, e se a minha classe FechaConta além de precisar de um carrinho ele precise agora de um outro obejto?
vc quebra em todo o lugar que vc add essa classe FechaConta.

Como tirar essa acoplamento? impossível.
mas… vc pode diminuí - lo aplicando inversão de controle, fazendo com que o GerenciaProduto receba o Objeto FechaConta com o carrinho dentro
Ficando assim…

class GerenciaProduto {

    private FechaConta fechaConta;

    public GerenciaProduto(FechaConta fechaConta){
        this.fechaConta = fechaConta;
    }

    public void executa(Produto produto){
        fechaConta.finaliza(produto);
    }

}

repara como o código ficou menos acoplado? se o meu objeto FechaConta precisar de um outro Objeto? problema dele… aqui não quebra mais!