Sto esplorando diversi concetti in python e mi è capitato di leggere un esempio di coroutine che può essere utilizzato per il modello di catena della responsabilità. Ho scritto il seguente codice:Implementazione del pattern Chain of responsibility in python usando le coroutine
from functools import wraps
def coroutine(function):
@wraps(function)
def wrapper(*args, **kwargs):
generator = function(*args, **kwargs)
next(generator)
return generator
return wrapper
@coroutine
def PlatinumCustomer(successor=None):
cust = (yield)
if cust.custtype == 'platinum':
print "Platinum Customer"
elif successor is not None:
successor.send(cust)
@coroutine
def GoldCustomer(successor=None):
cust = (yield)
if cust.custtype == 'gold':
print "Gold Customer"
elif successor is not None:
successor.send(cust)
@coroutine
def SilverCustomer(successor=None):
cust = (yield)
if cust.custtype == 'silver':
print "Silver Customer"
elif successor is not None:
successor.send(cust)
@coroutine
def DiamondCustomer(successor=None):
cust = (yield)
if cust.custtype == 'diamond':
print "Diamond Customer"
elif successor is not None:
successor.send(cust)
class Customer:
pipeline = PlatinumCustomer(GoldCustomer(SilverCustomer(DiamondCustomer())))
def __init__(self,custtype):
self.custtype = custtype
def HandleCustomer(self):
try:
self.pipeline.send(self)
except StopIteration:
pass
if __name__ == '__main__':
platinum = Customer('platinum')
gold = Customer('gold')
silver = Customer('silver')
diamond = Customer('diamond')
undefined = Customer('undefined')
platinum.HandleCustomer()
gold.HandleCustomer()
undefined.HandleCustomer()
Quello che ho cercato di fare qui è cercare di creare una catena di soluzione di modello di responsabilità per la gestione di diversi tipi di clienti (Platino, oro, diamanti, argento).
Per quel cliente ha una pipeline in cui ho menzionato l'ordine in cui verranno gestiti i diversi clienti. Cliente(). HandleCustomer invierà un'istanza di sé attraverso la pipeline che verificherà se il suo custtype corrisponde e quindi elaborarlo di conseguenza o lo invierà al suo successore (se disponibile)
PROBLEMA: il problema è che quando Corro lo script sopra, gestirà il primo cliente platino ma non l'oro o il non definito. Suppongo che questo sia dovuto al fatto che ha raggiunto la fine del generatore. Come posso modificare il codice in modo che ogni volta che si tratta di una nuova istanza di un cliente, passerà attraverso la pipeline dal suo inizio?
Funziona come un fascino. – Rivas
Mi scuso per non essere stato in grado di alzare la voce. Non ho abbastanza reputazioni. – Rivas