該模式屬于結構型模式
什么是門面模式?
定義:門面模式(有時候也稱為外觀模式)是指提供一個統一的接口去訪問多個子系統的多個不同的接口,它為子系統中的一組接口提供一個統一的高層接口。
外部與子系統的通信是通過一個門面(Facade)對象進行。
其實門面模式就是把幾個子系統(實例或者類.統一一個統一的接口進行執行,客戶端不用關注子系統,只用門面即可)
通俗的來說:將多個接口封裝為一個接口,比如調用A()方法,實則A()方法內部進行了多次不同程度的封裝,我們不需要關心A()方法內部的封裝有多復雜只需要調用A()方法來實現我們的目的即可。
話不多說上demo代碼://門面模式模擬:打開以及關閉照相機為例
//兩步:打開閃光燈、打開照相機
//?????關閉閃光燈、關閉照相機
//閃光燈類
class?Light
{
public?function?turnOn()
{
echo?'打開閃光燈
';
}
public?function?turnOff()
{
echo?'關閉閃光燈
';
}
}
//照相機類
class?Camera
{
public?function?active()
{
echo?'打開照相機
';
}
public?function?deactive()
{
echo?'關閉照相機
';
}
}
//按照傳統模式來實現照相?代碼肯定是如下這么寫的
/*
$light??=?new?Light();
$camera?=?new?Camera();
$light->turnOn();??//打開閃光燈
$camera->active();?//開始照相
*/
//以上這種方式不好,因為用戶需要調用2個接口才能完成工作,那我們能不能只讓用戶調用1一個接口就可以完成這個工作呢?
/*********偉大的分割線之門面(Facade)模式登場************/
//創建一個門面類
class?Facade
{
protected?$light;
protected?$camera;
public?function?__construct()
{
$this->light??=?new?Light();
$this->camera?=?new?Camera();
}
//照相的方法
public?function?start()
{
$this->light->turnOn();
$this->camera->active();
}
//關閉照相
public?function?stop()
{
$this->light->turnOff();
$this->camera->deactive();
}
}
//測試
$facade?=?new?Facade();
$facade->start();?//開始照相
echo?'
';
$facade->stop();?//關閉照相
/**
*經過上面的門面模式這種方式的改造,我們再去照相的時候,對于用戶對于客戶端來說,使用的時候就非常方便了
*開始照相只需要調用一個start方法,關閉照相只需要調用一個stop方法
*/
優點:
1、它對客戶屏蔽了子系統組件,因而減少了客戶處理的對象的數目并使得子系統使用起來更加方便。
2、實現了子系統與客戶之間的松耦合關系。
3、如果應用需要,它并不限制它們使用子系統類。因此可以在系統易用性與能用性之間加以選擇。
適用場景:
1、為一些復雜的子系統提供一組接口。
2、提高子系統的獨立性。
3、在層次化結構中,可以使用門面模式定義系統的每一層的接口。