定義
要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信必須通過(guò)一個(gè)統(tǒng)一的對(duì)象進(jìn)行。Facade(門(mén)面模式)提供一個(gè)高層次的接口姻成,使得子系統(tǒng)更易于使用撼泛。精髓在于封裝。
使用場(chǎng)景
為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口刽肠。
當(dāng)你需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí)溃肪,使用Facade模式定義子系統(tǒng)中每層的入口點(diǎn)。
Android 系統(tǒng)中Context具體實(shí)現(xiàn)類(lèi)ContextImpl對(duì)Activity 音五,廣播惫撰,資源等的封裝
通俗一點(diǎn),一部手機(jī)躺涝,它有電話(huà)功能厨钻,拍照功能,聽(tīng)歌功能坚嗜。通常你一部手機(jī)可以完成各種功能夯膀,而不是打電話(huà)用諾基亞,拍照要相機(jī)苍蔬,聽(tīng)歌要MP3诱建。如果你每使用一個(gè)功能就要操作特定的設(shè)備,會(huì)使得整個(gè)過(guò)程很復(fù)雜碟绑,而手機(jī)提供了統(tǒng)一的入口俺猿,集電話(huà),拍照格仲。聽(tīng)歌功能于一身押袍,使用方便,操作簡(jiǎn)單凯肋。
UML圖
外觀(guān)模式.png
角色介紹
系統(tǒng)圖
源碼中例子系統(tǒng)圖
Paste_Image.png
優(yōu)點(diǎn)
- 對(duì)客戶(hù)程序隱藏子系統(tǒng)細(xì)節(jié)谊惭,因而減少了客戶(hù)對(duì)于系統(tǒng)的耦合,能夠擁抱變化
- 外觀(guān)類(lèi)對(duì)子系統(tǒng)的接口封裝否过,使得系統(tǒng)更易于使用午笛。
缺點(diǎn)
- 外觀(guān)類(lèi)接口膨脹惭蟋,由于子系統(tǒng)的接口都有外觀(guān)類(lèi)統(tǒng)一對(duì)外暴露苗桂,使得外觀(guān)類(lèi)的API接口較多,在一定程度上增加了用戶(hù)使用成本告组。
- 外觀(guān)類(lèi)沒(méi)有遵循開(kāi)閉原則煤伟,當(dāng)業(yè)務(wù)出現(xiàn)變更時(shí),可能需要直接修改外觀(guān)類(lèi)木缝。
例子
/**
* 子系統(tǒng)2接口(拍照)
* Created by Niwa on 2017/8/11.
*/
public interface Camera {
/**
* open camera
*/
public void open();
/**
* close camera
*/
public void close();
/**
* take camera
*/
public void takePicture();
}
/** 子系統(tǒng)2實(shí)現(xiàn)類(lèi)
* Created by Niwa on 2017/8/11.
*/
public class CameraImpl implements Camera {
@Override
public void open() {
System.out.println("打開(kāi)相機(jī)");
}
@Override
public void close() {
System.out.println("關(guān)閉相機(jī)");
}
@Override
public void takePicture() {
System.out.println("拍照");
}
}
/** 子系統(tǒng)1接口(打電話(huà))
* Created by Niwa on 2017/8/11.
*/
public interface Phone {
/**
* 打電話(huà)
*/
public void dail();
/**
* 掛斷
*/
public void hangup();
}
/** 子系統(tǒng)1實(shí)現(xiàn)類(lèi)
* Created by Niwa on 2017/8/11.
*/
public class PhoneImpl implements Phone {
@Override
public void dail() {
System.out.println("打電話(huà)");
}
@Override
public void hangup() {
System.out.println("掛斷電話(huà)");
}
}
/** 手機(jī)外觀(guān)
* Created by Niwa on 2017/8/11.
*/
public class MobilePhone {
private Phone mPhone = new PhoneImpl();
private Camera camera = new CameraImpl();
public void dail(){
mPhone.dail();
}
public void videoChat(){
camera.open();
mPhone.dail();
}
public void takePicture(){
camera.open();
camera.takePicture();
}
}
/** 測(cè)試類(lèi)
* Created by Niwa on 2017/8/11.
*/
public class Test {
public static void main(String[] args){
MobilePhone s6 = new MobilePhone();
s6.dail();
s6.takePicture();
}
}
結(jié)果:
打電話(huà)
打開(kāi)相機(jī)
拍照
參考:
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)讀書(shū)》
各大佬博客
源代碼:DesignPattern
end