Created
April 17, 2013 00:59
-
-
Save gustavofonseca/5400946 to your computer and use it in GitHub Desktop.
Exemplo prático do design pattern ``Visitor``
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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