#include #include #include class Resource { public: Resource(const std::string& str): str_(str) {} const std::string& str() const { return str_; } private: std::string str_; }; class Converter { public: virtual void Convert(Resource* resource) = 0; }; class CurlyBracketConverter : public Converter { public: virtual void Convert(Resource* resource) { std::cout << "{" << resource->str() << "}\n"; } }; class SquareBracketConverter : public Converter { public: virtual void Convert(Resource* resource) { std::cout << "[" << resource->str() << "]\n"; } }; class Printer { public: Printer(Converter* converter): converter_(converter) {} void Print(Resource* resource) { converter_->Convert(resource); } private: Converter* converter_; }; int main() { Resource* resource = new Resource("Ala has a cat"); Printer printer(new SquareBracketConverter{}); Printer printer2(new CurlyBracketConverter{}); printer.Print(resource); printer2.Print(resource); delete resource; return 0; }