3.适配器模式
1.适配器模式
适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容一起工作的哪些类可以一起工作。它包括类适配器和对象适配器。
(1)对象适配器
适配器容纳一个它包裹的类的实例,适配器调用被包裹对象的物理实体
例:STL中的双端队列,支持前后两端插入与删除。STL实现栈和队列时,没有从头开始定义它们,而是直接使用双端队列实现。这里双端队列就扮演了
适配器角色。队列用到了它的后端插入,前段删除。而栈用到它的后端插入,后端删除。
//双端队列 class Deque { public: void push_back(int x) { std::cout << "Deque push_back." << std::endl; } void push_front(int x) { std::cout << "Deque push_front." << std::endl; } void pop_back() { std::cout << "Deque pop_back." << std::endl; } void pop_front() { std::cout << "Deque pop_front." << std::endl; } }; //顺序容器 class Sequence { public: virtual void push(int x) = 0; virtual void pop() = 0; }; //栈 class Stack : public Sequence { public: void push(int x) { m_deque.push_back(x); } void pop() { m_deque.pop_back(); } private: Deque m_deque; //双端队列 }; //队列 class Queue : public Sequence { public: void push(int x) { m_queue.push_back(x); } void pop() { m_queue.pop_front(); } private: Deque m_queue; //双端队列 }; int main() { Sequence* s1 = new Stack(); Sequence* s2 = new Queue(); s1->push(1); s1->pop(); s2->push(2); s2->pop(); delete s1; delete s2; return 0; }
(2)类适配器模式
适配器继承自己实现的类(一般多重继承)
class Target { public: virtual void Request() {} }; // "Adaptee" class Adaptee { public: void SpecificRequest() { std::cout << "Called SpecificRequest()" << std::endl; } }; // "Adapter" class Adapter : public Adaptee, public Target { public: void Request() { this->SpecificRequest(); } }; int main() { Target *t = new Adapter(); t->Request(); return 0; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步