門面模式及Java實現
一、概念
門面模式(Facade)也叫外觀模式,它隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面,所以門面模式也是一種結構性模式。門面模式為子系統的一組介面提供一個統一的訪問介面(入口),客戶端直接通過門面類裡的統一的訪問介面,來間接呼叫子系統的方法,從而減少客戶端和子系統的耦合。
二、角色及使用場景
簡單的說就是把一些複雜的流程封裝成一個介面供外部使用者使用。這個模式中,涉及到三個角色:
1) 門面角色:門面模式的核心,直接被客戶端呼叫,內部去具體呼叫子系統或子模組的功能
2) 子系統角色:實現子系統的功能,對客戶角色未知,提供介面或實現類供門面呼叫
3) 客戶角色:呼叫門面實現功能
整個呼叫關係如上圖所示,client為客戶角色、facade為門面角色,子系統為各個模組。門面模式一般應用於以下場景:
1) 為複雜的模組或子系統提供外部訪問的模組
2) 子系統相對獨立
3) 系統分層中,通過外觀模式定義每一層的入口
三、java實現
例如聚划算商家設定了某個商品開團後提醒參團的顧客,但是通知提醒同時需要簡訊通知和郵件通知,使用門面模式,商家設定後客戶端程式只調用門面傳送通知,具體怎麼通知客戶有門面負責,實現了客戶端程式和具體子系統的解耦
程式碼實現:
1.首先是子系統類
publicclass Sms {
public void sendMessage(){
System.out.println("send sms to notice customer");
}
}
public class Email { public void sendMessage(){ System.out.println("send email to notice customer"); } }
2.門面類
public class MessageFacade { private Sms sms; private Email email; public MessageFacade(){ sms=new Sms(); email=new Email(); } public void noticeCustomer(){ sms.sendMessage(); email.sendMessage(); } }
3.最後是客戶端呼叫
public static void main(String[] args) { //客戶端直接呼叫訊息門面去通知顧客,不需要知道子系統是怎麼傳送訊息的 MessageFacade messageFacade=new MessageFacade(); messageFacade.noticeCustomer(); }
四、外觀模式的優缺點
優點:
1. 鬆散耦合。客戶端和子系統解耦,子系統相對獨立,利於擴充套件和維護
2. 靈活易用。客戶端只需和門面互動即可實現功能,不需知道子系統的內部構成和實現,業務更新時也只需修改門面的規則即可。
3.層次清晰。子系統把暴露對外的功能通過門面提供統一訪問入口,客戶端訪問需通過上層的門面,系統結構層次更清晰
缺點:增加新的子系統可能需要修改門面類或客戶端,違背了“開閉原則”。