1. 程式人生 > >設計模式----門面模式

設計模式----門面模式

門面模式,也叫做外觀模式,是一種比較常用的封裝模式。它要求一個子系統的外部與其內部的通訊必須通過一個統一的物件進行。也就是門面模式提供一個高層次的介面,使得子系統更易於使用。
《設計模式之禪》提供了一個比較容易理解的例子:
投遞信件,我們寫信一般都需要包含以下操作:
1.準備道具(信紙,信封,筆,郵票等)
2.寫信
3.封裝信封,貼郵票
4.投遞到郵箱

人都是比價賴的,上面的操作太複雜,手裡沒有這些東西就要去買,也就是需要出門,還得跑路,買回來還得寫,寫完了還得出門去郵箱,太麻煩了。能不簡單一點呢?
正好郵局也知道這一點,所以上線一套的新的服務,當然不會免費的了。他把以上的操作簡化為:
1.你告訴我信的內容和地址,其他的我來
那我們通過這一步就能將內容送出去了,不用準備任何東西,甚至都不用出門,打個電話就OK了(有電話還寫什麼信啊)

那郵局新推出的這一業務,便是一種門面模式!!
郵局早已經準備好了一堆的信紙、郵票和信封,又顧用了一堆寫手,有招了一個封信和貼郵票的,最後直接把信送走就行了。如果上面每一步都是一個部門的話,使用者是完全不用接觸這部門,就可以把信送出了。
門面模式,便是提供這樣的一種服務,使用者只需要呼叫門面類中提供的方法即可,不用考慮門面內部各個模組的運作。

門面模式的類圖:
在這裡插入圖片描述

Facde 門面角色:
客戶端可以呼叫這個角色的方法,此角色知曉子系統的所有功能和責任。一般情況下,本角色會將所有從客戶端發來的請求委派到相應的子系統,也就說該角色沒有實際的業務邏輯,只是一個委託類。

Sub System 子系統角色
可以同時擁有一個或者多個子系統,子系統並不知道門面的存在,對於子系統來說,門面類也是另外一個客戶端而已

使用門面系統實現上面所說的過程:

/// <summary>
/// 我是寫信的人
/// </summary>
public class Client
{
    static void Main()
    {
        Facade facade = new Facade();
        //我是使用者,我告訴facade ,你要送這個資訊給這個人
        facade.SendMessage("你還好嗎?","北方的風");
    }
}

/// <summary>
/// 我是郵局(門面)
/// </summary>
public class Facade  {

    SendMessage send;
    public Facade()
    {
        send = new global::SendMessage();
    }

    public void SendMessage(string _content, string _address)
    {
        send.ReadyProp(); //準備道具
        send.WriteMessage(); //寫入資訊
        send.PackageMessage(); //封裝信封
        send.SendBox(); //投遞郵箱
    }
}

/// <summary>
/// 送信的系統(子系統)
/// </summary>
public class SendMessage
{
    public void ReadyProp() { }
    public void WriteMessage(string _content,string _address) { }
    public void PackageMessage() { }
    public void SendBox() { }
}

怎麼看都只是增加了一層封裝,是客戶端更容易使用而已!

門面模式的優勢:
1.減少系統的互相依賴(郵局內部的事怎麼能讓外人來插手呢)
2.提高了靈活性(不管郵局內部部門怎麼變動,對於客戶來說都沒有什麼影響)
3.提高安全性(郵局提供了這個業務你才能用,否則你怎用?)

門面模式的使用場景:
1.為一個複雜的模組或子系統提供一個外界訪問的介面
2.子系統相對獨立
3.預防低水平人員帶來的風險擴散

注意:

  • 一個子系統可以有多個門面(就像一個家快遞公司有N個門面,我負責這一塊,你負責那一塊一樣)
  • 門面不參與子系統內的業務邏輯,門面物件只是提供了一個訪問子系統的一個路徑而已