Esse é um dos meus patterns favoritos, trabalho dando manutenção em um framework atualmente e quase sempre que me deparo com uma situação onde preciso estender a funcionalidade ou padronizar alguma biblioteca de terceiros o delegate está lá para ser a solução do problema
Também gosto muito do padrão Delegate! Além dos exemplos que você mencionou, ele é bastante útil em cenários de aplicativos white-label, onde diferentes comportamentos podem ser delegados sem modificar o código principal. Trabalho com desenvolvimento para iOS com Swift, o Delegate é essencial para manter uma arquitetura mais estruturada e organizada.