設計模式(4)-外觀模式(Facade)
【描述】外觀模式通過在對必需的邏輯和方法的集合前建立簡單的外觀介面,隱藏來自呼叫的複雜性。
【UML圖】
圖1 外觀模式UML圖
(1) AirCondition、Fan、Light電器類定義了一個on和off的方法;
(2) Facade類定義了on和off的方法,並呼叫了AirCondition、Fan、Light類的on和off方法,隱藏呼叫的複雜性;
(3) 與組合模式的不同在於Facade和AirCondition、Fan、Light電器類是關聯的關係,而不是組合的關係。
【示例程式碼】
aircondition.h
#ifndef AIRCONDITION_H #define AIRCONDITION_H class AirCondition { public: AirCondition(); ~AirCondition(); public: void on(); void off(); }; #endif // AIRCONDITION_H
aircondition.cpp
#include <QDebug> #include "aircondition.h" AirCondition::AirCondition() { qDebug()<<"construct AirCondition"; } AirCondition::~AirCondition() { qDebug()<<"destruct AirCondition"; } void AirCondition::on() { qDebug()<<"AirCondition on"; } void AirCondition::off() { qDebug()<<"AirCondition off"; }
fan.h
#ifndef FAN_H
#define FAN_H
class Fan
{
public:
Fan();
~Fan();
public:
void on();
void off();
};
#endif // FAN_H
fan.cpp
#include <QDebug> #include "fan.h" Fan::Fan() { qDebug()<<"construct Fan"; } Fan::~Fan() { qDebug()<<"destruct Fan"; } void Fan::on() { qDebug()<<"Fan on"; } void Fan::off() { qDebug()<<"Fan off"; }
light.h
#ifndef LIGHT_H
#define LIGHT_H
class Light
{
public:
Light();
~Light();
public:
void on();
void off();
};
#endif // LIGHT_H
light.cpp
#include <QDebug>
#include "light.h"
Light::Light()
{
qDebug()<<"construct Light";
}
Light::~Light()
{
qDebug()<<"destruct Light";
}
void Light::on()
{
qDebug()<<"Light on";
}
void Light::off()
{
qDebug()<<"Light off";
}
facade.h
#ifndef FACADE_H
#define FACADE_H
#include "aircondition.h"
#include "fan.h"
#include "light.h"
class Facade
{
public:
Facade();
~Facade();
private:
AirCondition *_airCondition;
Fan *_fan;
Light *_light;
public:
void on();
void off();
};
#endif // FACADE_H
facade.cpp
#include <QDebug>
#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
#include "facade.h"
int main(void)
{
Facade *facade = new Facade;
facade->on();
facade->off();
return 0;
}
【執行結果】
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方法,實質上是一個外觀打包。
【程式碼清單】
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(clicked()),this,SLOT(cancel()));
connect(pushButton_ok,SIGNAL(clicked()),this,SLOT(Login()));
}
void LoginDlg::cancel()
{
lineEdit_username->clear();
lineEdit_passwd->clear();
close();
}
LoginDlg類中initDlg、cancel方法,應用了外觀模式。cancel方法運用了多型特性,覆蓋了LoginDlg的父類QDialog的cancel方法,是LoginDlg類的一個私有槽函式。外觀模式的應用使得建構函式更為清晰,initConnect方法更為簡單。這時可以利用:
connect(pushButton_cancel,SIGNAL(clicked()),this,SLOT(cancel()));
來取代
connect(pushButton_cancel,SIGNAL(clicked()),lineEdit_username,SLOT(clear()));
connect(pushButton_cancel,SIGNAL(clicked()),lineEdit_passwd,SLOT(clear()));
connect(pushButton_cancel,SIGNAL(clicked()),this,SLOT(close()));
將介面設計的程式碼從建構函式中,單獨分離,也是一種好的設計方式。
*對外觀模式有更好的見解,歡迎留言,交流學習。
【原始碼下載】
轉載請標明出處,僅供學習交流,勿用於商業目的
相關推薦
設計模式(4)-外觀模式(Facade)
【描述】外觀模式通過在對必需的邏輯和方法的集合前建立簡單的外觀介面,隱藏來自呼叫的複雜性。 【UML圖】 圖1 外觀模式UML圖 (1) AirCondition、Fan、Light電器類定義了一個on和off的方法; (2) Facade類定義了on和off的方法,並呼
【JAVA設計模式】外觀模式(Facade Pattern)
簡單 產生 creat ide oid dsm ref 功能 .net 一 定義 為子系統中的一組接口提供一個一致的界面。Facade模式定義了一個高層的接口,這個接口使得這一子系統更加easy使用。 二 案例 一個子系統中擁有3個模塊。每一個模塊
C#設計模式:外觀模式(Facade Pattern)
避免 linq 訪問 客戶端 這一 存在 www 針對 public 一,什麽是外觀模式? 外觀模式:為子系統中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統更加容易使用。 二,我們看看代碼的實現 using System; using Syste
設計模式:外觀(Facade)模式
text 一起 其它 QQ 如何 互調 IT 抽象 整合 設計模式:外觀(Facade)模式 一、前言 外觀模式是一種非常簡單的模式,簡單到我們經常都會使用,比如對於類A和B,如果兩者需要交互,經過一定的處理過程才能實現某一個具體的功能,那麽我們可以將這個處理的過程定義
設計模式 九 外觀模式Facade 結構型
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
設計模式之外觀模式(Facade)
設計模式之外觀模式(Facade) 場景 病人去醫院看病,首先病人必須先掛號,然後門診。如果醫生要求化驗,病人必須首先劃價,然後繳費,才可以到化驗部門做化驗。化驗後再回到門診室。 解決這種不便的方法便是引進外觀模式,醫院可以設定一個接待員的位置,由接待員負責代為掛號、劃價
二十三種設計模式[10] - 外觀模式(Facade Pattern)
前言 外觀模式,又稱門面模式,物件結構型模式。在《設計模式 - 可複用的面向物件軟體》一書中將之描述為“ 為系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用 ”。 模式 需要角
PHP設計模式之外觀模式(Facade)瞭解下
這個外觀模式,就是通過在必需的邏輯和方法的集合前建立簡單的外觀介面,並且還會隱藏了呼叫物件的複雜性,它和建造者模式非常相似,建造者模式一般是簡化物件的呼叫的複雜性,但是外觀模式一般是簡化含有很多邏輯步驟和方法呼叫的複雜性。 來看下例項,先來描述下: 設計一個User類,裡
設計模式(二)【Facade模式(外觀模式)】
Facade模式(外觀模式) 為子系統中的一組介面提供一個統一的介面。Facade模式定義了一個更高層的介面,使系統更容易使用。 Facade模式 關鍵特徵 意圖 希望簡化 原系統的使用方
面向物件設計模式之---外觀模式(Facade Pattern)
今天要向大家介紹的設計模式是外觀模式。外觀模式,聽上去好像很高大上的樣子,其實是非常簡單的。 在《大話設計模式》 這本書中舉的是股票與基金的例子。我又不炒股,對這些也不太敏感,於是就換一個更加通俗易懂的例子來解釋一下這個模式吧~ 比如我們買了一張新的手機卡後都需要辦理一些業務。但
設計模式之外觀(facade)模式
一、概念介紹 外觀模式(Facade),他隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了一個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用。 二、角色及使用場景 簡單來說,該
大話設計模式之外觀模式Facade
外觀模式(facade):為子系統中得一組介面 提供一個一致得介面,此模式定義了一個 高層介面,這個介面使得 這一子系統更加容易使用。 在學習外觀模式之前,看這麼一個需求: 最近你的同事都在炒股,你也想試一試,你就打算把炒股得程式碼寫一寫,分析分析。你的程式碼可能如下:T
淺談JAVA設計模式之——外觀模式(Facade)
一、概述 為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 二、適用性 1.當你要為一個複雜子系統提供一個簡單介面時。子系統往往因為不斷演化而變得越來越 複雜。大多數模式使用時都會產生更多更小的類。這使得子系
23設計模式之外觀模式(Facade)
1 概述 Facade屬於結構型模式中的一種,為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 2 適用性 當你要為一個複雜子
23種設計模式-9.外觀模式(Facade Pattern)
動機(Motivate): 在軟體開發系統中,客戶程式經常會與複雜系統的內部子系統之間產生耦合,而導致客戶程式隨著子系統的變化而變化。那麼如何簡化客戶程式與子系統之間的互動介面?如何將複雜系統的內部子系統與客戶程式之間的依賴解耦? 意圖(Intent): 為
java設計模式之外觀模式
數據 開發 移位運算 傳遞 保存 load space 法則 rep 【學習難度:★☆☆☆☆,使用頻率:★★★★★】 外觀模式是一種使用頻率非常高的結構型設計模式,它通過引入一個外觀角色來簡化客戶端與子系統之間的交互,為復雜的子系統調用提供一個統一的入口,降低子系統與
設計模式之外觀模式
設計模式 外觀模式 facade 門面模式 1、外觀模式的簡單介紹(也叫門面模式): a、外觀模式和迪米特法則(最少知識的原則,一個軟件實體應當盡可能少的與其他實體發生相互作用)的聯系緊密。 b、外觀模式的核心: - 為子系統提供統一的入口。封裝子系統的復雜性,便於
Head First設計模式之外觀模式
實現 add ads important pac mar private 入口 summary 一、定義 外觀模式提供了一個統一的接口,用來訪問子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。 外觀模式不只是簡化了接口,也將客戶從組件的子系統中解耦。
設計模式,外觀模式(6)
__name__ 基類 body 訪問 get self 簡化 self. getattr 外觀模式(Facade Pattern)隱藏系統的復雜性,並向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的復雜
2.泡妞與設計模式(三) 外觀模式
col 多個 style div AC 自己 box 有一個 int FACADE 門面(外觀)模式 門面模式:外部與一個子系統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的接口,使得子系統更易於使用。每一個子系統只有一個門面類,而且此門面類只有一個實例,也