Skip to content

Instantly share code, notes, and snippets.

@gustavofonseca
Created April 17, 2013 00:59
Show Gist options
  • Save gustavofonseca/5400946 to your computer and use it in GitHub Desktop.
Save gustavofonseca/5400946 to your computer and use it in GitHub Desktop.
Exemplo prático do design pattern ``Visitor``
# coding: utf-8
"""
Exemplo prático do design pattern ``Visitor``
Dúvidas
-------
* Como fazer quando utilizamos Descritores?
"""
class Produto(object):
def __init__(self, marca, preco):
self.marca = marca
self.preco = preco
class Leite(Produto):
def accept(self, visitante):
visitante.leite(self)
class Pao(Produto):
def accept(self, visitante):
visitante.pao(self)
class Manteiga(Produto):
def accept(self, visitante):
visitante.manteiga(self)
class Cafe(Produto):
def accept(self, visitante):
visitante.cafe(self)
class ListaDeCompras(object):
def __init__(self, *produtos):
self.produtos = produtos
def accept(self, visitante):
for produto in self.produtos:
produto.accept(visitante)
visitante.lista_de_compras(self)
class VisitanteHTML(object):
def __init__(self, instancia):
self.instancia = instancia
self.produtos = {}
def leite(self, instancia):
self.produtos['leite'] = u'<tr><td>{0}</td><td>{1}</td></tr>'.format(
instancia.marca,
instancia.preco
)
def pao(self, instancia):
self.produtos['pao'] = u'<tr><td>{0}</td><td>{1}</td></tr>'.format(
instancia.marca,
instancia.preco
)
def manteiga(self, instancia):
self.produtos['manteiga'] = u'<tr><td>{0}</td><td>{1}</td></tr>'.format(
instancia.marca,
instancia.preco
)
def cafe(self, instancia):
self.produtos['cafe'] = u'<tr><td>{0}</td><td>{1}</td></tr>'.format(
instancia.marca,
instancia.preco
)
def lista_de_compras(self, instancia):
tbody = '/n'.join(self.produtos.values())
self.produtos['lista'] = u"""
<table>
<thead>
<th>marca</th>
<th>preço</th>
</thead>
<tbody>
{0}
</tbody>
</table>
""".format(tbody)
def __unicode__(self):
self.instancia.accept(self)
return self.produtos['lista'].strip()
class VisitanteJSON(object):
def __init__(self, instancia):
self.instancia = instancia
self.produtos = {}
def leite(self, instancia):
self.produtos.update(
{'leite': {'marca': instancia.marca, 'preco': instancia.preco}}
)
def pao(self, instancia):
self.produtos.update(
{'pao': {'marca': instancia.marca, 'preco': instancia.preco}}
)
def manteiga(self, instancia):
self.produtos.update(
{'manteiga': {'marca': instancia.marca, 'preco': instancia.preco}}
)
def cafe(self, instancia):
self.produtos.update(
{'cafe': {'marca': instancia.marca, 'preco': instancia.preco}}
)
def lista_de_compras(self, instancia):
pass
def __unicode__(self):
import json
self.instancia.accept(self)
return json.dumps(self.produtos)
if __name__ == '__main__':
lista = ListaDeCompras(Leite('Parmalat', 2.40),
Pao('Seven Boys', 3.50),
Manteiga('Doriana', 5.00),
Cafe('Melita', 7.50))
visitante_html = VisitanteHTML(lista)
visitante_json = VisitanteJSON(lista)
print(unicode(visitante_html))
print(unicode(visitante_json))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment