設計模式之外觀模式(Facade)
阿新 • • 發佈:2018-11-10
設計模式之外觀模式(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();
}
}
類圖
使用外觀模式還有一個附帶的好處,就是能夠有選擇性地暴露方法
外觀模式的目的不是給予子系統新增新的功能介面,而是為了讓外部減少與子系統內多個模組的互動,鬆散耦合,從而讓外部能夠更簡單地使用子系統。
外觀模式的本質是:封裝互動,簡化呼叫。