学习软件设计,向OO高手迈进!
设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案。
这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
是前辈大神们留下的软件设计的"招式"或是"套路"。
将一个类的接口变换成客户端所期待的另一种接口, 从而使得原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
它包括类适配器和对象适配器,本文针对的是对象适配器。适配器模式让我们在设计时不必再关心现存类接口问题。


适配器模式中的角色:
下面我们使用手机充电来讲解该模式:
手机充电需要电源适配器将220V的交流电转化为手机锂电池需要的5V直流电。
一、定义目标类
DC5类:目标类(Target)
class DC5 {
public:
virtual int output5V() = 0;
};
二、定义被适配者
AC220类:被适配的类(Adaptee)
class AC220 {
public:
int output220V() {
int output = 220;
cout << "Current is AC" << output << "V" << endl;
return output;
}
};
三、定义适配器
AdapterDC5类:适配器类(Adapter)
class AdapterDC5 : public DC5 {
public:
AdapterDC5(AC220 *ac220) : m_ac220(ac220) {}
int output5V() {
int output = m_ac220->output220V() / 44;
cout << "Adapte succeed, current is DC" << output << "V" << endl;
return output;
}
private:
/* have a adaptee */
AC220 *m_ac220;
};
四、客户端
class Mobile
{
public:
Mobile(DC5 *dc5) : m_dc5(dc5) {}
void charging() {
int output = m_dc5->output5V();
if(output == 5)
cout << "Changing" << endl;
else if(output > 5)
cout << "Bomb" << endl;
}
private:
DC5 *m_dc5;
};
main函数
int main(int argc, char** argv) {
AC220 *pAC220 = new AC220;
Mobile *pIphone = new Mobile(new AdapterDC5(pAC220));
pIphone->charging();
return 0;
}
执行结果
Current is AC220V
Adapte succeed, current is DC5V
Changing
在 STL 中就用到了适配器模式。STL 实现了一种数据结构,称为双端队列(deque),
支持前后两端的插入与删除。STL 实现栈和队列时,没有从头开始定义它们,而是直接
使用双端队列实现的。这里双端队列就扮演了适配器的角色。队列用到了它的后端插入,
前端删除;而栈用到了它的后端插入,后端删除。
class MyDeque {
public:
void push_back() {}
void push_front() {}
void pop_back() {}
void pop_front() {}
};
class MyStack {
public:
void push() {
md.push_back();
}
void pop() {
md.pop_back();
}
private:
MyDeque md;
};
class MyQueue {
public:
void enQueue() {
md.push_back();
}
void deQueue() {
md.pop_front();
}
private:
MyDeque md;
};
类适配器与对象适配器的使用场景一致,仅仅是实现手段稍有区别,二者主要用于如下场景:
以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。