Às vezes, encontro essas APIs no estilo do hub de mensagens, por exemplo, o Cocoa NSNotificationCenter: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html
Geralmente essas APIs fornecem um ponto de acesso global no qual você se inscreve ou transmite mensagens / eventos. Estou pensando que isso é um problema, porque incentiva uma arquitetura de programa simples e não estruturada, onde as dependências não são explícitas na API, mas ocultas no código-fonte. Você não é forçado a pensar em propriedade e hierarquias de objetos, mas pode fazer com que qualquer objeto em seu programa resulte em qualquer código que seja chamado em qualquer lugar. Mas talvez isso seja uma coisa boa?
Esse padrão geralmente incentiva o design bom ou ruim do programa e por que? Isso torna o código mais difícil ou mais fácil de testar?
Perdoe-me se esta pergunta é muito vaga ou ampla. Estou tentando entender as possíveis consequências do uso extensivo de uma API como esta e as diferentes maneiras de usá-la.
Edit: Eu acho que meu maior problema com esse padrão é que a API "mente" sobre dependências e acoplamentos de objetos e pode ser ilustrada com este exemplo:
myObj = new Foo();
myOtherObj = new Bar();
print myOtherObj.someValue; // prints 0
myObj.doSomething();
print myOtherObj.someValue; // prints 1, unexpectedly, because I never indicated that these objects had anything to do with each other