Redes
Imagine a situação em que uma grande empresa possui uma ampla rede de representação de seus produtos constituída, basicamente, por escritórios de venda espalhados em diversas cidades. Cada escritório possui um conjunto de vendedores que vão até os varejistas oferecer os produtos da empresa. Varejistas podem estar em áreas populosas, como supermercados, ou em áreas remotas, como os comércios que abastecem bairros rurais. Ao chegar no varejista, o vendedor utiliza um sistema fornecido pela empresa para registrar os pedidos de produtos.
Na situação descrita, o objetivo é registrar os pedidos na base de dados da central de distribuição da empresa. Porém, por problemas de comunicação com a central, o computador portátil do varejista pode não conseguir conectar com a base central para registrar os pedidos. Quando isso ocorrer, o sistema deve tentar salvá-los na base de dados do escritório. Quando a base do escritório também não estiver acessível, os pedidos deverão ser salvos na base de dados local, no próprio computador portátil do vendedor. Futuramente, de alguma forma fora do escopo de nossa discussão, todos os dados poderão ser carregados na base central.
Várias soluções podem ser dadas para o problema acima, entre elas a descrita no padrão de projeto Chain of Responsibility. Antes de resolver o problema utilizando o padrão de projeto, apresentarei a estrutura do padrão e explicarei seu funcionamento.
O diagrama acima apresenta uma classe abstrata chamada Responsabilidade que possui uma operação responsável por executar algum serviço. Podemos notar pela nota ancorada à classe que a opereção é bastante simples: se existir um sucessor, chama a mesma operação no sucessor, senão, gera um erro informando que a operação não pode ser executada. Notem que o sucessor é uma referência para a própria classe Responsabilidade. Através dessa auto-referência, é possível montar uma cadeia de instâncias da classe responsabilidade, como em uma lista