TemplateMethodPattern
Usando
Eriko Morais
erikopa@gmail.com
em Linguagem Dinâmica
OqueéoGroovy
● Groovy é uma linguagem de programação orientada a objetos
desenvolvida para a plataforma Java como alternativa à
linguagem de programação Java. Groovy possui
características de Python, Ruby e Smalltalk.
● Groovy utiliza uma sintaxe similar à de Java, é compilada
dinamicamente para bytecode Java, e integra-se
transparentemente com outros códigos e bibliotecas Java.
Características
Groovy possui algumas características não presentes no Java
padrão:
● Tipagem estática e tipagem dinâmica
● Sintaxe nativa para listas, arrays associativos, vetores,
e expressões regulares
● Clausuras (Clojures)
● Sobrecarga de operadores
templatemethodpattern
“O Template Method define os passos de um algoritmo e
permite que a implementação de um ou mais desses passos seja
fornecida por subclasses.”
Eric Freeman & Elisabeth Freeman - Use a Cabeça! Padrões de Projeto - 2nd ed.- p. 213
templatemethodpattern
Exemplo
abstract class Accumulator {
protected initial
abstract doAccumulate(total, v)
def accumulate(values) {
def total = initial
values.each { v -> total = doAccumulate(total,
v) }
total
}
}
class Sum extends Accumulator {
def Sum() { initial = 0 }
def doAccumulate(total, v) { total + v }
}
class Product extends Accumulator {
def Product() { initial = 1 }
def doAccumulate(total, v) {
total * v }
}
println new
Sum().accumulate([1,2,3,4])
println new
Product().accumulate([1,2,3,4])
http://groovy-lang.org/design-patterns.html#_template_method_pattern
Simplificando
Você pode ter o resultado similar injetando um método usando
Closures.
Closure addAll = { total, item -> total += item }
def accumulated = [1, 2, 3, 4].inject(0, addAll)
println accumulated // => 10
Closure multAll = { total, item -> total *= item }
accumulated = [1, 2, 3, 4].inject(1, multAll)
println accumulated // => 24
Usando closures desta forma
parece mais com o padrão de
Strategy, mas se
percebermos que o método de
injeção built-in é a parte
genérica do algoritmo para
o nosso método de modelo,
em seguida, os Closures
tornam as peças
personalizadas do padrão
Template Method.
http://groovy-lang.org/design-patterns.html#_template_method_pattern
Umareferênciarápida
Imagem retirada de http://python.pro.br/wiki/index.php?title=Design_patterns
Obrigado!
Mais sobre a linguagem em:
http://www.groovy-lang.org/

Template method pattern

  • 1.
  • 2.
    OqueéoGroovy ● Groovy éuma linguagem de programação orientada a objetos desenvolvida para a plataforma Java como alternativa à linguagem de programação Java. Groovy possui características de Python, Ruby e Smalltalk. ● Groovy utiliza uma sintaxe similar à de Java, é compilada dinamicamente para bytecode Java, e integra-se transparentemente com outros códigos e bibliotecas Java.
  • 3.
    Características Groovy possui algumascaracterísticas não presentes no Java padrão: ● Tipagem estática e tipagem dinâmica ● Sintaxe nativa para listas, arrays associativos, vetores, e expressões regulares ● Clausuras (Clojures) ● Sobrecarga de operadores
  • 4.
    templatemethodpattern “O Template Methoddefine os passos de um algoritmo e permite que a implementação de um ou mais desses passos seja fornecida por subclasses.” Eric Freeman & Elisabeth Freeman - Use a Cabeça! Padrões de Projeto - 2nd ed.- p. 213
  • 5.
  • 6.
    Exemplo abstract class Accumulator{ protected initial abstract doAccumulate(total, v) def accumulate(values) { def total = initial values.each { v -> total = doAccumulate(total, v) } total } } class Sum extends Accumulator { def Sum() { initial = 0 } def doAccumulate(total, v) { total + v } } class Product extends Accumulator { def Product() { initial = 1 } def doAccumulate(total, v) { total * v } } println new Sum().accumulate([1,2,3,4]) println new Product().accumulate([1,2,3,4]) http://groovy-lang.org/design-patterns.html#_template_method_pattern
  • 7.
    Simplificando Você pode tero resultado similar injetando um método usando Closures. Closure addAll = { total, item -> total += item } def accumulated = [1, 2, 3, 4].inject(0, addAll) println accumulated // => 10 Closure multAll = { total, item -> total *= item } accumulated = [1, 2, 3, 4].inject(1, multAll) println accumulated // => 24 Usando closures desta forma parece mais com o padrão de Strategy, mas se percebermos que o método de injeção built-in é a parte genérica do algoritmo para o nosso método de modelo, em seguida, os Closures tornam as peças personalizadas do padrão Template Method. http://groovy-lang.org/design-patterns.html#_template_method_pattern
  • 8.
    Umareferênciarápida Imagem retirada dehttp://python.pro.br/wiki/index.php?title=Design_patterns
  • 9.
    Obrigado! Mais sobre alinguagem em: http://www.groovy-lang.org/