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("客戶使用銀行信用卡支付處理的邏輯...");
    }

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