Analise de sistema
Arquitetura e Padrões de Projeto (Design Patterns)
Padrão “Estratégia”
“O padrão Estratégia define uma família de algoritmos, encapsula cada uma deles e os torna intercambiáveis. O padrão “Estratégia” deixa o algoritmo variar independentemente dos clientes que o utilizam”
Padrão “Estratégia”
Ao colocar “emitirCheque” na superclasse, estamos permitindo que TODOS os clientes retirem cheques cliente +cartao: String +senha: int +validado: boolean +saldo: double +validar(String, int) +retirarSaldo() +sacar(double) +emitirCheque() +mostrarInformacoes()
O “sacar” do cliente especial é substituído, pois além de liberar o dinheiro ele emite o saldo
cliente_Comum +mostrarInformacoes()
aposentado +mostrarInformacoes()
cliente_Especial +sacar() +mostrarInformacoes()
Padrão “Estratégia”
●
Temos problemas:
●
Os clientes comuns e os aposentados estão emitindo cheques (e eles não poderiam fazer isso). Tivemos que substituir sacar para o cliente especial, pois a operação de saque dele é especial (e teremos que fazer isso para todos os clientes que tiverem um saque diferente daquele definido pela superclasse).
Qual a solução que vocês dariam???
●
Padrão “Estratégia”
●
Solução 1:
●
Substituir o método “emitirCheque” em todas as subclasses que não devem possuir esta funcionalidade. Acrescentar um método “sacar” para cada subclasse que possua um saque diferente daquele definido na superclasse.
O que vocês acham da idéia???
●
Padrão “Estratégia”
●
Funciona mas...
●
... é uma péssima idéia, pois o software do banco continuará crescendo e para cada nova subclasse que não deve emitir cheques teremos que substituir o método.
Padrão “Estratégia”
●
Solução 2: ● Implementar interfaces “emissãoCheque” e “saqueEspecial”, respectivamente com os métodos “emitirCheque()” e “sacarEspecial()”. Assim, somente as classes que podem emitir cheque e/ou possuem saque especial irão implementar estas interfaces e,