1. 程式人生 > >設計模式(3)門面模式--結構型

設計模式(3)門面模式--結構型

門面模式:外部與一個子系統的通訊必須通過一個統一的門面物件進行。門面模式提供一個高層次的介面,使得子系統更易於使用。
三大角色:
子系統角色:實現各個子系統的功能。門面角色和客戶角色對其是透明的,它沒有任何的資訊和連結。
門面角色:門面模式的核心。它被客戶角色呼叫,其熟悉子系統的功能,且其內部根據客戶角色的各種需求提供了不同的方法。
客戶角色:呼叫門面角色來實現所需的功能。

在什麼情況下使用門面模式
1. 為一個複雜子系統提供一個簡單介面
2. 提高子系統的獨立性
3. 在層次化結構中,可以使用Facade模式定義系統中每一層的入口。

門面模式的類圖
這裡寫圖片描述
典型案例是寄快遞(寄快遞的步驟:打包,拿去郵局,填快遞單,郵寄),醫院看病(掛號,就診,拿藥)。客戶端只需呼叫服務端的一個介面,服務端內部可以有多個操作。這也是迪米特法則的體現。

public class Registration {
    public void registerNormal(){
        System.out.println("first:registration normal.");
    }

    public void registerVip(){
        System.out.println("first:registration vip.");
    }
}
public class Doctor {
    public void doctorNormal(){
        System.out
.println("second:look doctor normal."); } public void doctorVip(){ System.out.println("second:look doctor vip."); } }
public class FetchMedicine {
    public void fetchMedicineNormal(){
        System.out.println("third:fetch medicine normal.");
    }

    public void fetchMedicineVip
(){ System.out.println("third:fetch medicine vip."); } }
public class FacadeSick   {

    private static Registration registration = new Registration();
    private static Doctor doctor = new Doctor();
    private static FetchMedicine fetchMedicine = new FetchMedicine();

    public void seeDoctorNormal() {
        registration.registerNormal();
        doctor.doctorNormal();
        fetchMedicine.fetchMedicineNormal();
    }

    public void seeDoctorVip() {
        registration.registerVip();
        doctor.doctorVip();
        fetchMedicine.fetchMedicineVip();
    }
}
public class Client {
    public static void main(String[] args){
        FacadeSick facadeSickNormal = new FacadeSick();
        facadeSickNormal.seeDoctorNormal();

        FacadeSick facadeSickVip = new FacadeSick();
        facadeSickVip.seeDoctorVip();
    }
}