定義:
要求一個子系統(tǒng)的外部與內(nèi)部的通信必須通過一個統(tǒng)一的對象進行。
外觀模式.png
例子1:
日常中可以打電話、拍照、微信聊天等,沒有智能手機之前,這些事情都是分開做的,現(xiàn)在有了智能手機。
你只需要通過調(diào)用手機這個統(tǒng)一對象,就可以干所有事情,而且不必知道里面的構(gòu)造和實現(xiàn)。
例子2:股民炒股
未使用外觀模式情況
1.png
要讓股民盡可能少的與股票直接打交道,給其提供一個蒙面,讓股民跟蒙面打交道。這樣就符合了迪米特法則,讓股民盡可能少的與股票打交道了。增加了外觀模式后的類圖:
2.png
2.實現(xiàn)代碼
未使用外觀模式情況下,代碼如下
子系統(tǒng)代碼:
public class SubSystemClass {
public void methodOne(){
System.out.println("子系統(tǒng)方法1");
}
}
class SubSystemClass2{
public void methodTwo(){
System.out.println("子系統(tǒng)方法2");
}
}
class SubSystemClass3{
public void methodThree(){
System.out.println("子系統(tǒng)方法3");
}
}
客戶端
public static void main(String[] args) {
//未使用外觀模式情況
SubSystemClass s1 = new SubSystemClass();
SubSystemClass2 s2 = new SubSystemClass2();
SubSystemClass3 s3 = new SubSystemClass3();
s1.methodOne();
s2.methodTwo();
s3.methodThree();
}
使用外觀模式:新增一個Facade類
/**
* 外觀模式:封裝子系統(tǒng),對外提供一個門面方法
*/
public class Facade {
//所有子系統(tǒng)的引用
private SubSystemClass s1 = null;
private SubSystemClass2 s2 = null;
private SubSystemClass3 s3 = null;
//構(gòu)造子系統(tǒng)的引用
public Facade() {
this.s1 = new SubSystemClass();
this.s2 = new SubSystemClass2();
this.s3 = new SubSystemClass3();
}
/**
* 具體的外觀方法
*/
public void facade(){
s1.methodOne();
s2.methodTwo();
s3.methodThree();
}
}
客戶端
public static void main(String[] args) {
//使用了外觀模式后
System.out.println("-----------------------");
Facade facade = new Facade();
facade.facade();
}
兩次的輸出結(jié)果為:
子系統(tǒng)方法1
子系統(tǒng)方法2
子系統(tǒng)方法3
-----------------------
子系統(tǒng)方法1
子系統(tǒng)方法2
子系統(tǒng)方法3
3.總結(jié)
其實外觀模式就是我們常見的封裝,在我們實際開發(fā)中,遇到的各種對子系統(tǒng)各模塊封裝的邏輯,都可以理解為外觀模式
- JDBC封裝后的,commons提供的DBUtils類
- Hibernate提供的工具類,Spring JDBC工具類等
Android中
- context中封裝了很多操作,只需要調(diào)用context就可以做很多事情;
- imageloader