Padrões GoF - Strategy 1 O Padrão Strategy • O padrão Strategy é semelhante ao padrão Template – Recordando: Template define em uma classe X um algoritmo composto por vários passos. Alguns desses passos são implementados de forma diferente nas subclasses de X. • O padrão Strategy fornece diferentes implementações de um algoritmo para uma classe cliente. • A classe cliente usa a implementação mais adequada em um dado instante. • GOF Book: – “Define a family of algorithms, encapsulate each one, and make them interchangeable. – “Strategy lets the algorithm vary independently from clients that use it.” 2 Estrutura do Strategy 3 Objetos Participantes • Strategy: – Define uma interface comum para todos os algoritmos suportados. – O objeto Context usa essa interface comum para chamar o algoritmo definido (implementado) por um objeto ConcreteStrategy. • ConcreteStrategy – Implementa o algoritmo usando a interface definida por Strategy • Context – É configurado com um objeto ConcreteStrategy – Mantém uma referência para um objeto Strategy – Pode definir uma interface que permite que o objeto Strategy faça acesso aos seus dados. 4 Strategy – exemplo • Uma instituição de ensino utiliza uma forma de calcular o grau final de um aluno em uma disciplina cursada. – Esse grau é uma letra: A, B, C, D ou E. – Além disso, esse grau é calculado a partir de notas atribuídas a avaliações. • O projetista identificou que, atualmente, cada nota varia na faixa de 0 até 10. – No entanto, identificou que é comum a coordenação modificar a estratégia (algoritmo) de atribuição de graus a partir da notas das avaliações. • Já existe uma classe (Participacao) que representa participações de alunos em uma disciplina. • Qual o melhor projeto de classes para cálculo do grau? 5 Strategy – exemplo (cont.) • Nessa solução, Participacao é uma classe que representa participações de alunos em uma disciplina e suas correspondentes avaliações em termos de notas. Além disso, a operação calcular retorna o grau do aluno. 6 Strategy – vantagens • Uma vantagem dessa solução está na flexibilidade resultante. – No exemplo, note que a região de código cliente não precisa ser alterada quando a forma de cálculo de grau tiver que ser alterada. – Tudo que a região de código cliente conhece acerca da região de código fornecedora do serviço é que existe uma operação chamada calcular, que realizar o cálculo. – A região de código cliente não sabe, e nem precisa saber, qual o objeto especifico que está fornecendo uma implementação dessa operação. • O acoplamento abstrato é mantido entre os elementos envolvidos. 7