一、概述
迪米特法則(最少知識原則):一個軟件實體應盡可能少的與其他實體發生相互作用。
外觀模式核心:為子系統提供統一的入口。封裝子系統的復雜性,便于客戶端調用。
二、案例
這里我們以注冊公司流程進行說明,先看當我們不使用外觀模式時的做法:
工商局.java
package cn.itcast.day241.facade;
public interface 工商局 {
public void checkName();//核對公司名稱,不能和別的公司重名
}
class 海淀區工商局 implements 工商局{
public void checkName() {
System.out.println("檢查名字是否有沖突");
}
}
銀行.java
package cn.itcast.day241.facade;
public interface 銀行 {
public void openAccount();//去銀行給公司開戶
}
class 中國工商銀行 implements 銀行{
public void openAccount() {
System.out.println("在中國工商銀行開戶");
}
}
質檢局.java
package cn.itcast.day241.facade;
public interface 質檢局 {
public void orgCodeCertificate();//辦理組織機構代碼證
}
class 海淀區質檢局 implements 質檢局{
public void orgCodeCertificate() {
System.out.println("在海淀區質檢局辦理組織機構代碼證");
}
}
稅務局.java
package cn.itcast.day241.facade;
public interface 稅務局 {
public void taxCertificate();//在稅務局辦理登記證
}
class 海淀區稅務局 implements 稅務局{
public void taxCertificate() {
System.out.println("在海淀區稅務局辦理登記證");
}
}
說明:以上就是我們注冊公司一般的三個步驟,如果我們不使用外觀模式,我們必須和以上的類進行交互,看使用方式:
Client.java
package cn.itcast.day241.facade;
public class Client {
public static void main(String[] args) {
工商局 a = new 海淀區工商局();
a.checkName();
質檢局 b = new 海淀區質檢局();
b.orgCodeCertificate();
稅務局 c = new 海淀區稅務局();
c.taxCertificate();
銀行 d = new 中國工商銀行();
d.openAccount();
}
}
說明:而如果我們使用外觀模式就需要將各個流程的細節封裝起來,對外只是提供一個注冊接口。
RegisterFacade.java
package cn.itcast.day241.facade;
//辦理注冊公司流程的接口對象
public class RegisterFacade {
public void register(){
工商局 a = new 海淀區工商局();
a.checkName();
質檢局 b = new 海淀區質檢局();
b.orgCodeCertificate();
稅務局 c = new 海淀區稅務局();
c.taxCertificate();
銀行 d = new 中國工商銀行();
d.openAccount();
}
}
說明:此時我們在使用的時候就非常容易了。
Client.java
package cn.itcast.day241.facade;
public class Client {
public static void main(String[] args) {
new RegisterFacade().register();
}
}
三、開發中的場景:
頻率很高。哪里都會遇到。各種技術和框架中,都有外觀模式的使用。如:
jdbc
封裝后,commons
提供的DBUtils
類,Hibernate
提供的工具類、Spring JDBC
工具類等。