STL中的stack和queue就是典型的适配器
1. 情景与意图
在我们的日常生活中就有很多的适配器接口,比如mac电脑仅仅提供了两个type-c的接口,但是我们需要连接显示器,或者usb等等,此时就需要一个适配器接口,将type-c接口转换成我们能用的接口。在C++的STL中,我们有时候需要FIFO或者LIFO的数据结构,此时我们将双端队列进行封装成我们想要的stack和queue。
适配器模式主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
2. 适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
3. stack
现在我们简单实现一个栈。用双端队列作为底层容器。
template <class T>
class DPStack {
std::deque<T> _containser;
public:
void push(const T& value) {
_containser.push_back(value);
}
void pop() {
if (!_containser.empty()) {
_containser.pop_back();
}
}
T& top() {
return _containser.back();
}
bool empty() {
return _containser.empty();
}
void print() {
if (_containser.empty()) {
std::cout << "Error, DPStack obj is empty!\n";
return;
}
DPStack tmpStack(*this);
do {
std::cout << tmpStack.top() << " ";
tmpStack.pop();
} while (!tmpStack.empty());
std::cout << "\n======print over=====\n";
}
};
使用一下吧:
int main() {
DPStack<int> intStack;
intStack.push(1);
intStack.push(2);
intStack.push(3);
intStack.push(4);
intStack.print();
DPStack<float> floatStack;
floatStack.print();
return 0;
}
4. 总结
适配器模式还是比较简单的。主要是为了在当前的接口不适用于当前的环境时,可以使用组合的方式来复用代码。
C++实现适配器模式:【适配器模式C++源码】