1. 程式人生 > >java設計模式之門面模式及Java實現

java設計模式之門面模式及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. 層次清晰。子系統把暴露對外的功能通過門面提供統一訪問入口,客戶端訪問需通過上層的門面,系統結構層次更清晰

缺點:
增加新的子系統可能需要修改門面類或客戶端,違背了“開閉原則”。