基本介紹
1)外觀模式(Facade,也叫“過程模式:外觀模式為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
2)外觀模式通過定義一個一致的接口,用以屏蔽內部子系統的細節,使得調用端只需跟這個接口發生調用,而無需關心這個子系統的內部細節。
外觀模式類圖
原理類圖的說明(外觀模式的角色)
1)外觀類(Facade):為調用端提供統一的調用接口,外觀類知道哪些子系統負責處理請求,從而將調用端的請求代理給適當子系統對象。
2)調用者(Client):外觀接口的調用者。
3)子系統的集合:指模塊或者子系統,處理Facade對象指派的任務,他是功能的實際提供。
外觀模式的注意事項和細節
1)外觀模式對外屏蔽了子系統的細節,因此外觀模式降低了客戶端對子系統使用的復雜性。
2)外觀模式對客戶端與子系統的耦合關系,讓子系統內部的模塊更易維護和擴展。
3)通過合理的使用外觀模式,可以幫我們更好的劃分訪問的層次。
4)當系統需要進行分層設計時,可以考慮使用Facade模式。
5)在維護一個遺留的大型系統時,可能這個系統已經變得非常難以維護和擴展,此時可以考慮為新系統開發一個Facade類,來提供遺留系統的比較清晰簡單的接口,讓新系統與Facade類交互,提高復用性。
6)不能過多的或者不合理的使用外觀模式,使用外觀模式好,還是直接調用模塊好。要以讓系統有層次,利于維護為目的。
UML
外觀模式UML
代碼實現
客戶端 FacadeTest
package com.yuan.dp.facade;
public class FacadeTest {
public static void main(String[] args) throws InterruptedException {
遙控器 remoteControl = new 遙控器();
remoteControl.ready("十樓一號");
System.out.println();
System.out.println();
System.out.println();
Thread.sleep(1000 * 2);
System.out.println(
"開始開會.........."
);
System.out.println();
System.out.println();
System.out.println();
Thread.sleep(1000 * 5);
remoteControl.over("十樓一號");
}
}
外觀類 遙控器
package com.yuan.dp.facade;
/**
* 外觀類_遙控器 RemoteControl
* 在 一次用到很多類的方法是采取考慮使用外觀模式
*/
public class 遙控器 {
擴音器 loudspeaker;
投影儀 Projector;
燈 lamp;
窗簾 windowCurtains;
麥克風 microphone;
public 遙控器() {
loudspeaker = new 擴音器();
Projector = new 投影儀();
lamp = new 燈();
windowCurtains = new 窗簾();
microphone = new 麥克風();
}
void ready(String address) {
System.out.println(address + "會場 會議準備.............");
windowCurtains.on();
lamp.off();
Projector.on();
microphone.on();
loudspeaker.on();
}
void over(String address) {
System.out.println(address + "會場 會議結束.............");
windowCurtains.off();
lamp.on();
Projector.off();
microphone.off();
loudspeaker.off();
}
}
子系統類 (窗簾、投影儀、擴音器、燈、麥克風)
package com.yuan.dp.facade;
/**
* 被裝飾類_窗簾 WindowCurtains
*/
public class 窗簾 {
/**
* 窗簾拉上
*/
void on() {
System.out.println("窗簾拉上.....");
}
/**
* 窗簾拉開
*/
void off() {
System.out.println("窗簾拉開.....");
}
}
/**
* 被裝飾類_燈 lamp
*/
class 燈 {
/**
* 打開照明
*/
void on() {
System.out.println("打開照明.....");
}
/**
* 關閉照明
*/
void off() {
System.out.println("關閉照明.....");
}
}
/**
* 被裝飾類_投影儀 Projector
*/
class 投影儀 {
/**
* 投影儀開啟
*/
void on() {
System.out.println("投影儀開啟.....");
}
/**
* 投影儀關閉
*/
void off() {
System.out.println("投影儀關閉.....");
}
}
/**
* 被裝飾類_麥克風 Microphone
*/
class 麥克風 {
/**
* 麥克風開啟
*/
void on() {
System.out.println("麥克風開啟.....");
}
/**
* 麥克風關閉
*/
void off() {
System.out.println("麥克風關閉.....");
}
}
/**
* 被裝飾類_擴音器 Loudspeaker
*/
class 擴音器 {
/**
* 擴音器開啟
*/
void on() {
System.out.println("擴音器開啟.....");
}
/**
* 擴音器關閉
*/
void off() {
System.out.println("擴音器關閉.....");
}
}