Skip to content

Instantly share code, notes, and snippets.

@Vinnik67
Created April 29, 2026 10:20
Show Gist options
  • Select an option

  • Save Vinnik67/38543f13d44060a44e6d94a41510bd2e to your computer and use it in GitHub Desktop.

Select an option

Save Vinnik67/38543f13d44060a44e6d94a41510bd2e to your computer and use it in GitHub Desktop.
#include <iostream>
using namespace std;
class Receiver {
bool BankTransfer;
bool MoneyTransfer;
bool PayPalTransfer;
bool CryptoTransfer; // new field
public:
Receiver(bool bt, bool mt, bool ppt, bool ct) {
BankTransfer = bt;
MoneyTransfer = mt;
PayPalTransfer = ppt;
CryptoTransfer = ct;
}
bool GetBankTransfer() { return BankTransfer; }
void SetBankTransfer(bool BankTransfer) { this->BankTransfer = BankTransfer; }
bool GetMoneyTransfer() { return MoneyTransfer; }
void SetMoneyTransfer(bool MoneyTransfer) { this->MoneyTransfer = MoneyTransfer; }
bool GetPayPalTransfer() { return PayPalTransfer; }
void SetPayPalTransfer(bool PayPalTransfer) { this->PayPalTransfer = PayPalTransfer; }
bool GetCryptoTransfer() { return CryptoTransfer; }
void SetCryptoTransfer(bool CryptoTransfer) { this->CryptoTransfer = CryptoTransfer; }
};
class PaymentHandler {
protected:
PaymentHandler* Successor;
public:
PaymentHandler* GetHandler() { return Successor; }
void SetHandler(PaymentHandler* Successor) { this->Successor = Successor; }
virtual void Handle(Receiver* receiver) = 0;
};
class BankPaymentHandler : public PaymentHandler {
public:
void Handle(Receiver* receiver) override {
if (receiver->GetBankTransfer())
cout << "Bank transfer\n";
else if (Successor != nullptr)
Successor->Handle(receiver);
}
};
class MoneyPaymentHandler : public PaymentHandler {
public:
void Handle(Receiver* receiver) override {
if (receiver->GetMoneyTransfer())
cout << "Transfer through money transfer systems\n";
else if (Successor != nullptr)
Successor->Handle(receiver);
}
};
class PayPalPaymentHandler : public PaymentHandler {
public:
void Handle(Receiver* receiver) override {
if (receiver->GetPayPalTransfer())
cout << "Transfer via PayPal\n";
else if (Successor != nullptr)
Successor->Handle(receiver);
}
};
class CryptoPaymentHandler : public PaymentHandler {
public:
void Handle(Receiver* receiver) override {
if (receiver->GetCryptoTransfer())
cout << "Transfer via cryptocurrency\n";
else if (Successor != nullptr)
Successor->Handle(receiver);
}
};
void Request(PaymentHandler* h, Receiver* receiver) {
h->Handle(receiver);
}
int main() {
PaymentHandler* bankPaymentHandler = new BankPaymentHandler();
PaymentHandler* moneyPaymentHandler = new MoneyPaymentHandler();
PaymentHandler* paypalPaymentHandler = new PayPalPaymentHandler();
PaymentHandler* cryptoPaymentHandler = new CryptoPaymentHandler();
bankPaymentHandler->SetHandler(paypalPaymentHandler);
paypalPaymentHandler->SetHandler(moneyPaymentHandler);
moneyPaymentHandler->SetHandler(cryptoPaymentHandler);
Receiver* receiver = new Receiver(false, false, false, true);
Request(bankPaymentHandler, receiver);
delete receiver;
receiver = new Receiver(false, true, false, false);
Request(bankPaymentHandler, receiver);
delete receiver;
receiver = new Receiver(true, false, false, false);
Request(bankPaymentHandler, receiver);
delete receiver;
receiver = new Receiver(false, false, true, false);
Request(bankPaymentHandler, receiver);
delete receiver;
delete bankPaymentHandler;
delete moneyPaymentHandler;
delete paypalPaymentHandler;
delete cryptoPaymentHandler;
system("pause");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment