一、模式定義
外觀模式(Facade Pattern):外部與一個子系統的通信必須通過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。外觀模式又稱爲門面模式,它是一種對象結構型模式。
二、模式動機
- 降低訪問複雜系統的內部子系統時的複雜度,簡化客戶端與內部子系統之間的接口;
- 客戶端不需要知道系統內部的複雜聯繫,整個系統只需提供一個"接待員"(外觀/門面類)即可,由此類負責與內部的複雜聯繫;
- 外觀類爲包含了許多活動部件的複雜子系統提供一個簡單的接口。 與直接調用子系統相比, 外觀提供的功能可能比較有限, 但它卻包含了客戶端真正關心的功能。
三、模式結構
外觀模式包含如下角色:
Facade: 外觀角色
SubSystem:子系統角色
四、代碼實現
現實生活中,一個系統實現不同方式的醫院預約掛號(支付寶、微信、京東金融、城市APP)各不相同,病人看完病之後選擇付款方式,根據用戶選擇的付款方式進行付款處理流程也各不相同。
在一個系統中面對如此之多的各式各樣的服務接口,對於客戶端來說快速有效的找到想要使用的接口方法,以及避免客戶端與內部接口系統建立過於複雜的關聯關係,此時就可以考慮通過外觀/門面模式處理。以下是簡化版的示例代碼:
角色 | 類 |
---|---|
Facade: 外觀角色 | ServiceFacade.java |
SubSystem:子系統角色 | CalculatorAdaptee.java |
Client.java
package com.design.demo.structure.facade;
/**
* 客戶端測試類
*
* @author administrator
* @date 2020-05-19 0:20
*/
public class Client {
public static void main(String[] args) {
//得到外觀類的實例
ServiceFacade serviceFacade = new ServiceFacade();
//通過外觀實例調用子系統方法
serviceFacade.zfbAppointment("32678234234233243", "張三丰");
serviceFacade.creditCardCheck("張三丰");
}
}
ServiceFacade.java
package com.design.demo.structure.facade;
/**
* 外觀/門面模式類
* @author administrator
* @date 2020-05-19 0:16
*/
public class ServiceFacade {
//支付寶預約
private Appointment zfbAppointmentImpl = new ZfbAppointmentImpl();
//微信預約
private Appointment weixinAppointmentImpl = new WeixinAppointmentImpl();
//支付寶支付
private Pay zfbPayImpl = new ZfbPayImpl();
//銀行信用卡支付
private Pay creditCardPayImpl = new CreditCardPayImpl();
/**
* 支付寶預約
* @param id
* @param name
*/
public void zfbAppointment(String id, String name) {
zfbAppointmentImpl.doctorAppointment(id,name);
}
/**
* 微信預約
* @param id
* @param name
*/
public void weixinAppointment(String id, String name) {
weixinAppointmentImpl.doctorAppointment(id,name);
}
/**
* 支付寶付款
* @param name
*/
public void zfbCheck(String name) {
zfbPayImpl.check(name);
}
/**
* 信用卡付款
* @param name
*/
public void creditCardCheck(String name) {
creditCardPayImpl.check(name);
}
}
Appointment.java
package com.design.demo.structure.facade;
/**
* 掛號預約抽象類
*
* @author administrator
* @date 2020-05-19 0:03
*/
public interface Appointment {
/**
* 預約醫生
*
* @param id 病人證件號碼
* @param name 病人姓名
*/
public void doctorAppointment(String id, String name);
}
ZfbAppointmentImpl.java
package com.design.demo.structure.facade;
/**
* 通過支付寶來預約的實現
*
* @author administrator
* @date 2020-05-19 0:06
*/
public class ZfbAppointmentImpl implements Appointment {
@Override
public void doctorAppointment(String id, String name) {
System.out.println("通過支付寶來預約的實現..." + id + name);
}
}
WeixinAppointmentImpl.java
package com.design.demo.structure.facade;
/**
* 通過微信來預約的實現
*
* @author administrator
* @date 2020-05-19 0:06
*/
public class WeixinAppointmentImpl implements Appointment {
@Override
public void doctorAppointment(String id, String name) {
System.out.println("通過微信來預約的實現..." + id + name);
}
}
Pay.java
package com.design.demo.structure.facade;
/**
* 支付抽象類
*
* @author administrator
* @date 2020-05-19 0:09
*/
public interface Pay {
/**
* 支付費用
*
* @param name 支付人名稱
*/
public void check(String name);
}
ZfbPayImpl.java
package com.design.demo.structure.facade;
/**
* 客戶使用支付寶支付
*
* @author administrator
* @date 2020-05-19 0:13
*/
public class ZfbPayImpl implements Pay {
@Override
public void check(String name) {
System.out.println("客戶使用支付寶支付處理的邏輯...");
}
}
CreditCardPayImpl.java
package com.design.demo.structure.facade;
/**
* 客戶使用銀行信用卡支付
*
* @author administrator
* @date 2020-05-19 0:13
*/
public class CreditCardPayImpl implements Pay {
@Override
public void check(String name) {
System.out.println("客戶使用銀行信用卡支付處理的邏輯...");
}
}