定義:
要求一個(gè)子系統(tǒng)的外部與內(nèi)部的通信必須通過(guò)一個(gè)統(tǒng)一的對(duì)象進(jìn)行。
外觀模式.png
例子1:
日常中可以打電話、拍照、微信聊天等,沒(méi)有智能手機(jī)之前,這些事情都是分開(kāi)做的,現(xiàn)在有了智能手機(jī)。
你只需要通過(guò)調(diào)用手機(jī)這個(gè)統(tǒng)一對(duì)象,就可以干所有事情,而且不必知道里面的構(gòu)造和實(shí)現(xiàn)。
例子2:股民炒股
未使用外觀模式情況
1.png
要讓股民盡可能少的與股票直接打交道,給其提供一個(gè)蒙面,讓股民跟蒙面打交道。這樣就符合了迪米特法則,讓股民盡可能少的與股票打交道了。增加了外觀模式后的類(lèi)圖:
2.png
2.實(shí)現(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();
}
使用外觀模式:新增一個(gè)Facade類(lèi)
/**
* 外觀模式:封裝子系統(tǒng),對(duì)外提供一個(gè)門(mén)面方法
*/
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é)
其實(shí)外觀模式就是我們常見(jiàn)的封裝,在我們實(shí)際開(kāi)發(fā)中,遇到的各種對(duì)子系統(tǒng)各模塊封裝的邏輯,都可以理解為外觀模式
- JDBC封裝后的,commons提供的DBUtils類(lèi)
- Hibernate提供的工具類(lèi),Spring JDBC工具類(lèi)等
Android中
- context中封裝了很多操作,只需要調(diào)用context就可以做很多事情;
- imageloader