?**定義**:(Facada Pattern)要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行,
門面模式提供一個高層次的接口,使得子系統更易于使用。
## 一般模式:

Facade門面角色
---|客戶端可以調用這個角色的方法,此角色知道子系統的所有功能和責任。
subSystem子系統角色
---|可以同時一個或多個子系統。每個子系統都不是一個單獨的類,而是一個類的集合
子系統并不知道門面的存在,對于子系統而言,門面僅僅是另一個客戶端而已。
模型圖:

~~~
public class FacadeTest {
public static void main(String[] args) {
//獲取門面對象
Facade f = new Facade();
//調用子系統A的方法
f.methodA();
}
}
/**
* 子系統A,在具體的項目中
* 子系統并不是一個類,而是一個類的集合,這里只是簡單地
* 以類來代替子系統。
* @author admin
*
*/
class ClassA{
public void doSomethingA(){
System.out.println("子系統A的具體功能...");
}
}
/**
* 子系統A,在具體的項目中
* 子系統并不是一個類,而是一個類的集合,這里只是簡單地
* 以類來代替子系統。
* @author admin
*
*/
class ClassB{
public void doSomethingB(){
System.out.println("子系統B的具體功能...");
}
}
/**
* 門面,是外界訪問子系統中的具體功能的入口。
* @author admin
*
*/
class Facade{
private ClassA classA = new ClassA();
private ClassB classB = new ClassB();
//提供給外部訪問子系統的方法
public void methodA(){
this.classA.doSomethingA();
}
//提供給外部訪問子系統的方法
public void methodB(){
this.classB.doSomethingB();
}
}
~~~
## 一個例子:
郵寄一封信要經過一下四個步驟:寫信的內容、信的封面、封好、投遞到郵箱。
這寫必要的步驟相當于一個系統,客戶端可以通過門面類來調用這個系統的方法。

~~~
public class FacadeT {
public static void main(String[] args) {
//獲取門面類
ModenPostOffice mpo = new ModenPostOffice();
mpo.sendMessage("您好!\nOracle,I want to change the world including my lover!", "2020年的我!");
}
}
interface ILetterProcess{
//寫信的內容
void wirteLetter(String context);
//信的封面
void fillEnvelope(String address);
//裝封好信件
void letterInotoEnvolope();
//投遞到郵箱
void sendLetter();
}
/**
* 信件方法的具體實現類,子系統內部的某個類。
* @author admin
*
*/
class LetterProcessImpl implements ILetterProcess{
@Override
public void wirteLetter(String context) {
System.out.println("信件的內容是:"+context);
}
@Override
public void fillEnvelope(String address) {
System.out.println("信件的地址是:"+address);
}
@Override
public void letterInotoEnvolope() {
System.out.println("裝封好了信件...");
}
@Override
public void sendLetter() {
System.out.println("發送信件...");
}
}
/**
* 門面類,為外部系統訪問內部系統提供接口。
* @author admin
*
*/
class ModenPostOffice{
private ILetterProcess letter = new LetterProcessImpl();
//
public void sendMessage(String context,String address){
//先寫好信
this.letter.wirteLetter(context);
//在寫好地址
this.letter.fillEnvelope(address);
//找到郵局,投遞信件
this.letter.letterInotoEnvolope();
//發送信件
this.letter.sendLetter();
}
}
~~~
**門面模式的優點:**
---|減少系統的相互依賴
---|提高靈活性
---|提高安全性
**門面模式的缺點:**
---|不符合開閉原則
**門面模式的使用場景**
---|為一個復雜的模塊或子系統提供一個共外界訪問的接口
---|子系統相對獨立---外界對子系統的訪問只要黑箱操作即可
---|預防低水平人員帶來的風險擴散
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式