1. 定義
隱藏系統(tǒng)的復(fù)雜性挖胃,并向客戶端提供了一個(gè)客戶端可以訪問(wèn)系統(tǒng)的接口
通過(guò)創(chuàng)建一個(gè)統(tǒng)一的類命锄,用來(lái)包裝子系統(tǒng)中一個(gè)或多個(gè)復(fù)雜的類
(由外觀類去保存各個(gè)子系統(tǒng)的引用霉撵,實(shí)現(xiàn)由一個(gè)統(tǒng)一的外觀類去包裝多個(gè)子系統(tǒng)類枕面,然而客戶端只需要引用這個(gè)外觀類稻轨,然后由外觀類來(lái)調(diào)用各個(gè)子系統(tǒng)中的方法)
2. 使用場(chǎng)景
1. 為復(fù)雜的模塊或子系統(tǒng)提供外界訪問(wèn)的接口
2. 子系統(tǒng)相對(duì)獨(dú)立
3. 預(yù)防低水平人員帶來(lái)的風(fēng)險(xiǎn)
3. 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1. 降低了客戶類與子系統(tǒng)類的耦合度励翼,實(shí)現(xiàn)松耦合關(guān)系2. 對(duì)客戶屏蔽了子系統(tǒng)組件蜈敢,從而簡(jiǎn)化了接口差油,減少了客戶處理的對(duì)象數(shù)目并使子系統(tǒng)的使用更加簡(jiǎn)單无蜂。3. 降低原有系統(tǒng)的復(fù)雜度和系統(tǒng)中的編譯依賴性,并簡(jiǎn)化了系統(tǒng)在不同平臺(tái)之間的移植過(guò)程
缺點(diǎn):
1. 在不引入抽象外觀類的情況下线欲,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼造烁,違背了“開(kāi)閉原則”2. 不能很好地限制客戶使用子系統(tǒng)類否过,如果對(duì)客戶訪問(wèn)子系統(tǒng)類做太多的限制則減少了可變性和靈活性狱从。
4. Android源碼中的使用:
Context封裝了很多操作,如startActivity()叠纹,sendBroadcast()季研,bindServiced()等,相當(dāng)于抽象外觀類誉察,Context的子系統(tǒng)中去實(shí)現(xiàn)這些方法与涡,如ActivityManagerService實(shí)現(xiàn)startActivity(),PackageManagerService實(shí)現(xiàn)包信息相關(guān)方法,ContextImpl則是Context的實(shí)現(xiàn)類持偏,也就是外觀類驼卖,其內(nèi)部調(diào)用這些子系統(tǒng)的實(shí)現(xiàn),而Activity相當(dāng)于客戶端鸿秆,其上兩層父類ContextWrapper中有個(gè)一個(gè)Context類型的mBase字段酌畜,其實(shí)際類型是ContextImpl,是對(duì)外觀類的調(diào)用,例如ContextWrapper中:
5. 實(shí)例演示
以智能家居,統(tǒng)一管理家電為例
1. 各種家電作為子系統(tǒng)卿叽,如燈桥胞,電視,空調(diào)等
2. 智能遙控器作為外觀類(現(xiàn)在很多有紅外功能的Andorid手機(jī)都有智能遙控器app, 比如我常用的遙控精靈就挺好用考婴,不用再去抱著一大堆的各種遙控器)
3. 通過(guò)外觀類去操作各子系統(tǒng)
?我是今陽(yáng)贩虾,如果想要進(jìn)階和了解更多的干貨,歡迎關(guān)注公眾號(hào)”今陽(yáng)說(shuō)“接收我的最新文章