1. 程式人生 > >設計模式(4)-外觀模式(Facade)

設計模式(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 門面(外觀)模式 門面模式:外部與一個子系統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的接口,使得子系統更易於使用。每一個子系統只有一個門面類,而且此門面類只有一個實例,也