基本概念
适配器模式(Adapter Pattern)是一种结构型设计模式,允许将一个类的接口转换成客户端所期望的另一个接口,可以让原本由于接口不兼容而不能一起工作的类能够一起工作。
适配器模式需要实现的部分为:
- Target类:定义客户端使用的接口。
- Adaptee类:需要被适配的类,它已经存在但接口与Target类不兼容。
- Adapter类:适配器类,通过实现Target接口并持有一个Adaptee对象来对其进行适配。
使用场景
- 当需要将一个类与另一个不兼容的接口进行协同工作时。
- 当需要重用某个类,但其接口与所要求的不匹配时。
- 当需要一个类去实现多个接口时。
实现
QT源码:信号与槽机制
我们都知道信号与槽机制可以连接两个参数并不完全相同,也就是接口不兼容的两个类中的函数。以下是connect函数的实现:
static QMetaObject::Connection connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);
可以看到这里返回了一个静态的 QMetaObject::Connection 对象,查看定义:
class Q_CORE_EXPORT QMetaObject::Connection {
void *d_ptr; //QObjectPrivate::Connection*
......
}
//QObjectPrivate::Connection
struct Connection : public ConnectionOrSignalVector
{
// 连接到此对象中插槽的连接的链表,下一个在基类中
Connection **prev;
// 连接到此对象中信号的连接的链接列表
QAtomicPointer<Connection> nextConnectionList;
Connection *prevConnectionList;
//信号发送者
QObject *sender;
//信号接收者
QAtomicPointer<QObject> receiver;
......
};
可以看出 QMetaObject::Connection 里面有一个d指针指向 QObjectPrivate::Connection,而QObjectPrivate::Connection 里定义了信号与槽的各种信息,也就是作为适配器。
总结一下,在信号与槽中:
-
源接口:任何 QObject 类的信号,用于触发某些操作。
-
适配器:QMetaObject::Connection ,里面定义了信号与槽的各种信息。
-
目标接口:一个槽函数或者是一个 QObject 类的成员函数,用于响应信号。