/** * The Implementation defines the interface for all implementation classes. It * doesn't have to match the Abstraction's interface. In fact, the two * interfaces can be entirely different. Typically the Implementation interface * provides only primitive operations, while the Abstraction defines higher- * level operations based on those primitives. */
/** * Each Concrete Implementation corresponds to a specific platform and * implements the Implementation interface using that platform's API. */ classConcreteImplementationA : public Implementation { public: std::string OperationImplementation()constoverride{ return"ConcreteImplementationA: Here's the result on the platform A.\n"; } }; classConcreteImplementationB : public Implementation { public: std::string OperationImplementation()constoverride{ return"ConcreteImplementationB: Here's the result on the platform B.\n"; } };
/** * The Abstraction defines the interface for the "control" part of the two class * hierarchies. It maintains a reference to an object of the Implementation * hierarchy and delegates all of the real work to this object. */
virtual std::string Operation()const{ return"Abstraction: Base operation with:\n" + this->implementation_->OperationImplementation(); } }; /** * You can extend the Abstraction without changing the Implementation classes. */ classExtendedAbstraction : public Abstraction { public: ExtendedAbstraction(Implementation* implementation) : Abstraction(implementation) { } std::string Operation()constoverride{ return"ExtendedAbstraction: Extended operation with:\n" + this->implementation_->OperationImplementation(); } };
/** * Except for the initialization phase, where an Abstraction object gets linked * with a specific Implementation object, the client code should only depend on * the Abstraction class. This way the client code can support any abstraction- * implementation combination. */ voidClientCode(const Abstraction& abstraction){ // ... std::cout << abstraction.Operation(); // ... } /** * The client code should be able to work with any pre-configured abstraction- * implementation combination. */