淺談Laravel中的設計模式(二) Facade 外觀模式

閱讀時長:5分鐘bash

技術預備:熟悉Laravel的使用框架

外觀模式(Facade)

1、首先什麼是外觀模式呢?

看過Laravel文檔的童鞋必定聽過門面模式,當初第一次看到這個詞我是很懵逼的,門?臉?門臉都能有模式??函數

查閱以後,其實應該叫外觀模式。spa

簡單來講,就是爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。3d

咱們知道,定義都是很枯燥的,因此讓咱們來舉個栗子:code

$students = DB::table('student')->get();
$students = $students->toArray();
複製代碼

使用過Laravel框架的童鞋們必定見過這種代碼。 只須要靜態調用DB類,就可以使用這個類裏面的方法了,其實這種調用就叫作外觀模式。 在Laravel中很是多經常使用的類都使用到了外觀模式,例如DB、Session等。 cdn

能夠看到,在這種Facade類中,都只定義了一個方法getFacadeAccessor(),那麼爲何這個方法只返回「db」就可使用了呢?咱們能夠去翻翻Facade類源碼。

(有些童鞋不知道何時叫方法何時叫函數。若是一個代碼塊是獨立的,那的確能夠稱爲函數(function),但若是代碼塊是在類裏面的,應該要稱爲方法(method))對象

能夠看到,Facade這個抽象類實現了__callStatic()靜態調用方法,其中又調用了getFacadeRoot(),而getFacadeRoot()裏就調用了剛纔的getFacadeAccessor()獲取服務提供者的別名,在DB類中即「db」。 resolveFacadeInstance()就經過Laravel的容器機制把DB的實際對象解析了出來,這樣既實現了單例模式,又容易調用。blog

(關於容器機制不瞭解的童鞋,請關注之後的文章哦o( ̄▽ ̄)d)繼承

2、外觀模式有什麼用呢?

在一個龐大的系統中,充滿了許多的子系統和子模塊協做,而外部對於子系統的調用會造成很是大的耦合。

這樣的耦合顯然就違背了咱們拆解系統的初衷,也讓系統拆分失去了意義。

而外觀模式其實就是爲了將調用和框架解耦,減小系統中的相互依賴。 咱們能夠在Laravel的Application類中看到別名對應的實際類:

在這裏,「db」對應的是\Illuminate\Database\DatabaseManager::class這個類。

而若是某一天,咱們須要替換掉這個類,只須要將這裏的DatabaseManager替換成你要的類,並不須要去修改代碼邏輯。

(估計有童鞋會說:「趙童鞋你耍我呢,怎麼可能替換框架的類呢?」,當一個項目足夠龐大的時候,將路由類,Application容器類替換掉都是有可能的)

可是外觀模式也不是沒有缺點的,不符合開閉原則,若是要改東西很麻煩,繼承重寫都不合適。 須要注意的是,咱們不該該經過實現或者繼承一個外觀類,爲子系統添加新的功能。 這是典型錯誤的作法,其違背了外觀模式的初衷。

3、結語

外觀模式就到這裏一段落了~

若是有哪裏解釋不清楚的話,歡迎留言哦~

----- End -----

更多好文

請掃描下面二維碼

歡迎關注~

相關文章
相關標籤/搜索