Java GoF 23种设计模式-结构型模式-外观模式(Facade Pattern)

一、模式定义

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

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章