Adapter pattern-i uyğunsuz interfeysli siniflərin birgə işləməsinə imkan verir. Adapter müştərinin gözlədiyi interfeysi həyata keçirir və hər çağırışı uyğunlaşdırılan sinfə tərcümə edir. Üçüncü tərəf kitabxanalarını onların formalarını hər yerə yaymadan öz koduna belə qoşurlar.
Problem: uyğunsuz interfeyslər
Ödəniş kodumuz gateway.pay(amount, card) istəyir. Ödəniş SDK-sı create_charge(cents, currency, source) təklif edir və dict qaytarır. Köhnə bank API-si make_payment(euros, account_no) təklif edir və "OK" ya da "FAIL" qaytarır. Heç birini dəyişə bilmərik.
class StripeLikeSdk: # third-party code, we cannot edit it
def create_charge(self, cents, currency, source):
return {"id": "ch_1", "status": "succeeded", "amount": cents}
class OldBankApi: # another vendor, another shape
def make_payment(self, euros, account_no):
return "OK" if euros > 0 else "FAIL"
def checkout(gateway, amount, card):
print("paid" if gateway.pay(amount, card) else "declined")
try:
checkout(StripeLikeSdk(), 12.5, "tok_1")
except AttributeError as e:
print(e)'StripeLikeSdk' object has no attribute 'pay'Obyekt adapteri
Adapter təchizatçı obyektini saxlayır (kompozisiya) və bizim interfeysi həyata keçirir. O, avronu sentə çevirir, valyuta əlavə edir və təchizatçı nəticəsini bool-a çevirir. Müştəri pay-in arxasında hansı təchizatçının durduğunu bilmir.