1. 程式人生 > >設計模式之外觀模式(Facade)

設計模式之外觀模式(Facade)

設計模式之外觀模式(Facade)

場景

病人去醫院看病,首先病人必須先掛號,然後門診。如果醫生要求化驗,病人必須首先劃價,然後繳費,才可以到化驗部門做化驗。化驗後再回到門診室。
解決這種不便的方法便是引進外觀模式,醫院可以設定一個接待員的位置,由接待員負責代為掛號、劃價、繳費、取藥等。這個接待員就是外觀模式的體現,病人只接觸接待員,由接待員與各個部門打交道。

這篇文章對外觀模式講的不錯
https://www.jianshu.com/p/b9dd384d14a8

門診

public class Outpatient {

    //耳鼻喉科
    public
void ent(){ System.out.println("outpatient ent"); } //面板科 public void dermatology(){ System.out.println("outpatient dermatology"); } }

掛號

public class Registration {
    //耳鼻喉科
    public void ent(){
        System.out.println("Registration ent");
    }

    //面板科
    public
void dermatology(){ System.out.println("Registration dermatology"); } }

繳費

public class Pay {

    public void payFees(){
        System.out.println("pay the fees.");
    }
}

取藥

public class Medicine {
    public void getMedicine(){
        System.out.println("get the medicine."
); } }

接待員進行封裝

public class Facade {

    private Outpatient outpatient;

    private Registration registration;

    private Pay pay;

    private Medicine medicine;

    public Facade(){
        outpatient = new Outpatient();
        registration = new Registration();
        pay = new Pay();
        medicine = new Medicine();
    }

    public void ent(){
        registration.ent();
        outpatient.ent();
        pay.payFees();
        medicine.getMedicine();
    }

    public void dermatology(){
        registration.dermatology();
        outpatient.dermatology();;
        pay.payFees();
        medicine.getMedicine();
    }
}

測試

public class APP {
    @Test
    public void facadeTest(){
        Facade facade = new Facade();

        facade.ent();

        System.out.println("===========");
        facade.dermatology();
    }

}

類圖
在這裡插入圖片描述

使用外觀模式還有一個附帶的好處,就是能夠有選擇性地暴露方法
外觀模式的目的不是給予子系統新增新的功能介面,而是為了讓外部減少與子系統內多個模組的互動,鬆散耦合,從而讓外部能夠更簡單地使用子系統。

外觀模式的本質是:封裝互動,簡化呼叫。