一、模式定义
外观模式(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("客户使用银行信用卡支付处理的逻辑...");
}
}