Reusabilidade não é exclusiva da programação orientada a objetos, nem os design patterns, é somente o resultado de organização do código.
A primeira parte parte conseguir reusabilidade é saber modularizar o teu programa, separá-lo em subsistemas, pacotes, classes e métodos, e definir uma única responsabilidade, genérica ou específica, para cada um deles.
Responsabilidade é ter uma única parte do sistema inteiro que vai atender e tratar um determinado problema, removendo duplicata de código por todo o sistema.
Algo que ajuda a definir responsabilidades é fazer a classe depender o mínimo possível de outras classes do sistema que não tem nada a ver com ela, que não a ajudam a resolver o que ela tem que fazer. É o que chamamos de baixo acoplamento. Um sistema com alto acoplamento é aquele que comporta como um jogo de “Pega-vareta”, onde se você mexer no lugar errado, derruba uma parte que não tem nada a ver com a história.
O objetivo final é transformar um código de 20 mil linhas que faz tudo no método principal, para várias classes e métodos que cada um faz a sua parte.