#include <iostream>
#include <memory>
class Adaptee {
public:
void concreteShow() { std::cout << "In Adaptee concreteShow()." << std::endl; }
};
class Target {
public:
virtual void request () { std::cout << "In Target Show()." << std::endl; }
};
class Adapter1 : public Target {
public:
Adapter1(std::shared_ptr<Adaptee> a) { this->a = a; }
void request() override { a->concreteShow(); }
private:
std::shared_ptr<Adaptee> a = nullptr;
};
class Adapter2 : public Target, public Adaptee {
public:
void request() override { concreteShow(); }
};
int main(int argc, char *argv[]) {
std::unique_ptr<Target> t = std::make_unique<Target>();
t->request();
std::shared_ptr<Adaptee> a = std::make_shared<Adaptee>();
t = std::make_unique<Adapter1>(a);
t->request();
t = std::make_unique<Adapter2>();
t->request();
return 1;
}