设计模式(4)-外观模式(Facade) (二)

2014-11-24 11:48:39 · 作者: · 浏览: 1
ight->on();
}

void Facade::off()
{
qDebug()<<"Facade::off";

_airCondition->off();
_fan->off();
_light->off();
}
#include
#include "facade.h"

Facade::Facade()
{
qDebug()<<"construct Facade";

_airCondition = new AirCondition;
_fan = new Fan;
_light = new Light;
}

Facade::~Facade()
{
qDebug()<<"destruct Facade";

delete _airCondition;
delete _fan;
delete _light;
}

void Facade::on()
{
qDebug()<<"Facade::on";

_airCondition->on();
_fan->on();
_light->on();
}

void Facade::off()
{
qDebug()<<"Facade::off";

_airCondition->off();
_fan->off();
_light->off();
}

main.cpp

[html] view plaincopyprint #include "facade.h"

int main(void)
{
Facade *facade = new Facade;
facade->on();
facade->off();

return 0;
}
#include "facade.h"

int main(void)
{
Facade *facade = new Facade;
facade->on();
facade->off();

return 0;
}

【运行结果】

[html]
construct Facade
construct AirCondition
construct Fan
construct Light
Facade::on
AirCondition on
Fan on
Light on
Facade::off
AirCondition off
Fan off
Light off
construct Facade
construct AirCondition
construct Fan
construct Light
Facade::on
AirCondition on
Fan on
Light on
Facade::off
AirCondition off
Fan off
Light off

【结果分析】
Facade的on方法为电器类on方法的集合提供了接口,可以根据需要定义不同的on方法。

【实例剖析】

外观模式是我们常用的设计模式,有时候不知不觉就用到了。看下面一个登陆界面的设计实例。

先看UML图,

\

图2

(1) LoginDlg继承了QDialog类,实现用户登录鉴权;

(2) LoginDlg调用了QLabel、QLineEdit进行界面设计,界面设计的代码单独分离,构建了外观方法,提供给构造函数调用;

(3) 提供了cancel方法,cancel调用了QLineEdit相关对象的clear方法,实质上是一个外观打包。

【代码清单】

[html]
LoginDlg::LoginDlg()
{
//qDebug()<<"construct_login";
initDlg();
initConnect();
}

LoginDlg::~LoginDlg()
{
delete label_username;
delete label_passwd;
delete lineEdit_username;
delete lineEdit_passwd;
delete pushButton_ok;
delete pushButton_cancel;

//qDebug()<<"desstruct_login";
}

void LoginDlg::initDlg()
{
setWindowFlags(Qt::FramelessWindowHint);
label_username = new QLabel;
label_username->setText(tr("用 户 名:"));
label_passwd = new QLabel;
label_passwd->setText(tr("用户密码:"));
lineEdit_username = new QLineEdit;
lineEdit_username->setFocus();
lineEdit_passwd = new QLineEdit;
lineEdit_passwd->setEchoMode(QLineEdit::Password);

pushButton_ok = new QPushButton;
pushButton_ok->setText(tr("确定"));
pushButton_ok->setIcon(style()->standardIcon(QStyle::SP_DialogOkButton));
pushButton_cancel = new QPushButton;
pushButton_cancel->setText(tr("取消"));
pushButton_cancel->setIcon(style()->standardIcon(QStyle::SP_DialogCancelButton));

QGridLayout *gridLayout = new QGridLayout;
gridLayout->addWidget(label_username,0,0);
gridLayout->addWidget(lineEdit_username,0,1);
gridLayout->addWidget(label_passwd,1,0);
gridLayout->addWidget(lineEdit_passwd,1,1);

QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch();
buttonLayout->addWidget(pushButton_ok);
buttonLayout->addStretch();
buttonLayout->addWidget(pushButton_cancel);
buttonLayout->addStretch();

QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(gridLayout);
mainLayout->addLayout(buttonLayout);
mainLayout->addStretch();

setLayout(mainLayout);
}

void LoginDlg::initConnect()
{
connect(pushButton_cancel,SIGNAL(clicke