个人技术分享

基本概念

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一群接口,从而简化了客户端与子系统之间的交互,这种方式隐藏了子系统的复杂性,使客户端更容易使用子系统。

外观模式需要实现的部分为:

  • Facade(外观类):提供一个简单的接口,用于访问子系统中的一群接口。
  • Subsystem(子系统类):实现子系统的功能,被外观类所调用。

适用场景

  • 当需要为复杂的子系统提供一个简单的接口时。
  • 当需要将子系统与客户端解耦时,使得子系统的改变不会影响到客户端。
  • 需要减少系统中类与类直接的直接依赖关系时。

实现

QWidget 的 resize 函数

总所周知,当 QWidget 使用 resize() 改变其大小时,其所有子类的Widget都会改变大小,这正是外观模式中,通过一个简单接口来实现子系统的一群接口的案例。

源码如下:

void QWidget::resize(const QSize &s)
{
    //声明 d 为指向 QWidget 的私有数据的指针
    Q_D(QWidget);
    setAttribute(Qt::WA_Resized);
    if (testAttribute(Qt::WA_WState_Created)) {
        //修改 d 指针的大小
        d->fixPosIncludesFrame();
        d->setGeometry_sys(geometry().x(), geometry().y(), s.width(), s.height(), false);
        d->setDirtyOpaqueRegion();
    } else {
        const auto oldRect = data->crect;
        data->crect.setSize(s.boundedTo(maximumSize()).expandedTo(minimumSize()));
        if (oldRect != data->crect)
            setAttribute(Qt::WA_PendingResizeEvent);
    }
}

如代码所示,Q_D(QWidget);是一个宏,它指向声明 d 为 QWidget 的私有数据的指针,然后在改变d指针的大小,实现了外观模式