閱讀時長:5分鐘bash
技術預備:熟悉Laravel的使用框架
看過Laravel文檔的童鞋必定聽過門面模式,當初第一次看到這個詞我是很懵逼的,門?臉?門臉都能有模式??函數
查閱以後,其實應該叫外觀模式。spa
簡單來講,就是爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。3d
咱們知道,定義都是很枯燥的,因此讓咱們來舉個栗子:code
$students = DB::table('student')->get();
$students = $students->toArray();
複製代碼
使用過Laravel框架的童鞋們必定見過這種代碼。 只須要靜態調用DB類,就可以使用這個類裏面的方法了,其實這種調用就叫作外觀模式。 在Laravel中很是多經常使用的類都使用到了外觀模式,例如DB、Session等。 cdn
(有些童鞋不知道何時叫方法何時叫函數。若是一個代碼塊是獨立的,那的確能夠稱爲函數(function),但若是代碼塊是在類裏面的,應該要稱爲方法(method))對象
能夠看到,Facade這個抽象類實現了__callStatic()靜態調用方法,其中又調用了getFacadeRoot(),而getFacadeRoot()裏就調用了剛纔的getFacadeAccessor()獲取服務提供者的別名,在DB類中即「db」。 resolveFacadeInstance()就經過Laravel的容器機制把DB的實際對象解析了出來,這樣既實現了單例模式,又容易調用。blog
(關於容器機制不瞭解的童鞋,請關注之後的文章哦o( ̄▽ ̄)d)繼承
在一個龐大的系統中,充滿了許多的子系統和子模塊協做,而外部對於子系統的調用會造成很是大的耦合。
這樣的耦合顯然就違背了咱們拆解系統的初衷,也讓系統拆分失去了意義。
而外觀模式其實就是爲了將調用和框架解耦,減小系統中的相互依賴。 咱們能夠在Laravel的Application類中看到別名對應的實際類:
而若是某一天,咱們須要替換掉這個類,只須要將這裏的DatabaseManager替換成你要的類,並不須要去修改代碼邏輯。
(估計有童鞋會說:「趙童鞋你耍我呢,怎麼可能替換框架的類呢?」,當一個項目足夠龐大的時候,將路由類,Application容器類替換掉都是有可能的)
可是外觀模式也不是沒有缺點的,不符合開閉原則,若是要改東西很麻煩,繼承重寫都不合適。 須要注意的是,咱們不該該經過實現或者繼承一個外觀類,爲子系統添加新的功能。 這是典型錯誤的作法,其違背了外觀模式的初衷。
外觀模式就到這裏一段落了~
若是有哪裏解釋不清楚的話,歡迎留言哦~
----- End -----
更多好文
請掃描下面二維碼
歡迎關注~