設計模式(3)門面模式--結構型
阿新 • • 發佈:2019-02-11
門面模式:外部與一個子系統的通訊必須通過一個統一的門面物件進行。門面模式提供一個高層次的介面,使得子系統更易於使用。
三大角色:
子系統角色:實現各個子系統的功能。門面角色和客戶角色對其是透明的,它沒有任何的資訊和連結。
門面角色:門面模式的核心。它被客戶角色呼叫,其熟悉子系統的功能,且其內部根據客戶角色的各種需求提供了不同的方法。
客戶角色:呼叫門面角色來實現所需的功能。
在什麼情況下使用門面模式
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();
}
}