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.

python
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)
text
'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.