1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| class Target { public: virtual ~Target() = default;
virtual std::string Request() const { return "Target: The default target's behavior."; } };
class Adaptee { public: std::string SpecificRequest() const { return ".eetpadA eht fo roivaheb laicepS"; } };
class Adapter : public Target { private: Adaptee *adaptee_;
public: Adapter(Adaptee *adaptee) : adaptee_(adaptee) {} std::string Request() const override { std::string to_reverse = this->adaptee_->SpecificRequest(); std::reverse(to_reverse.begin(), to_reverse.end()); return "Adapter: (TRANSLATED) " + to_reverse; } };
void ClientCode(const Target *target) { std::cout << target->Request(); }
int main() { std::cout << "Client: I can work just fine with the Target objects:\n"; Target *target = new Target; ClientCode(target); std::cout << "\n\n"; Adaptee *adaptee = new Adaptee; std::cout << "Client: The Adaptee class has a weird interface. See, I don't understand it:\n"; std::cout << "Adaptee: " << adaptee->SpecificRequest(); std::cout << "\n\n"; std::cout << "Client: But I can work with it via the Adapter:\n"; Adapter *adapter = new Adapter(adaptee); ClientCode(adapter); std::cout << "\n"; delete target; delete adaptee; delete adapter; return 0; }
|