Curs 6 - Adapter, Decorator, Proxy și Chain of Responsibility în Python

Acest curs explorează Adapter, Decorator, Proxy și Chain of Responsibility, modele utilizate pentru flexibilitate și extinderea comportamentului obiectelor.

1. Adapter

Pattern-ul Adapter permite obiectelor cu interfețe incompatibile să colaboreze printr-un adaptor.

class VechiSistem:
    def operatiune_veche(self):
        return "Funcționalitate veche"

class Adapter:
    def __init__(self, vechi_sistem):
        self.vechi_sistem = vechi_sistem
    
    def operatiune_noua(self):
        return self.vechi_sistem.operatiune_veche()

sistem = VechiSistem()
adapter = Adapter(sistem)
print(adapter.operatiune_noua())  # Output: Funcționalitate veche

2. Decorator

Decorator permite adăugarea dinamică de comportament obiectelor fără a modifica codul sursă.

def decorator_simplu(functie):
    def wrapper():
        print("Înainte de apel")
        functie()
        print("După apel")
    return wrapper

@decorator_simplu
def salut():
    print("Salutare!")

salut()

3. Proxy

Pattern-ul Proxy oferă un substitut pentru controlul accesului la un obiect real.

class ServiciuReal:
    def operatiune(self):
        return "Date din serviciul real"

class Proxy:
    def __init__(self):
        self.serviciu_real = None
    
    def operatiune(self):
        if self.serviciu_real is None:
            self.serviciu_real = ServiciuReal()
        return self.serviciu_real.operatiune()

proxy = Proxy()
print(proxy.operatiune())  # Output: Date din serviciul real

4. Chain of Responsibility

Chain of Responsibility permite trimiterea unei cereri printr-un lanț de obiecte care decid dacă o procesează sau o pasează mai departe.

class Handler:
    def __init__(self, succesor=None):
        self.succesor = succesor
    
    def gestioneaza(self, cerere):
        if self.succesor:
            return self.succesor.gestioneaza(cerere)
        return "Niciun handler disponibil."

class HandlerConcret(Handler):
    def gestioneaza(self, cerere):
        if cerere == "cerere1":
            return "HandlerConcret a procesat cererea."
        return super().gestioneaza(cerere)

handler = HandlerConcret(Handler())
print(handler.gestioneaza("cerere1"))  # Output: HandlerConcret a procesat cererea.

Resurse suplimentare: