天天看點

結合項目執行個體 回顧傳統設計模式(七)擴充卡模式(附外觀模式)

記得以前章節談過的裝飾者模式,我們将對象包裝起來,賦予他們新的職責。而現在則是以不同目的,包裝某些對象:讓他們的接口看起來不像自己而像是别的東西。這樣就可以在設計中,将類的接口轉換成想要的接口,以便實作不同的接口。

在項目中,擴充卡模式一般扮演者協調者的作用。

1.客戶通過目标接口調用擴充卡的方法對擴充卡送出請求

2.擴充卡使用被适配者接口把請求轉換成被适配者的一個或多個調用接口

3.客戶接受到調用的結果,但并未察覺這一切是擴充卡在起轉換作用

另外還有一種特殊情況,萬一系統新舊并存,舊的部分期望舊的廠商接口,但我們卻已經使用新廠商的接口編寫了這一部分,這個時候該怎麼辦?這裡使用擴充卡,那裡卻使用未包裝的接口,這實在讓人感到混亂。這種情況需要建立一個雙向的擴充卡,支援兩邊的接口。

關于這一節的項目 咱們就選銀行支付驅動

/// <summary>

    /// 支付驅動

    /// </summary>

    public interface PayChannelDriver

    {

        void PayCallBack();

        string ReplaceHtmlCode(string order_no, string order_create_time,string currency, string extra, string goods_desc);

    }

    /// <summary>

    /// 銀行支付驅動

    public class CMBPayChannelDriver : PayChannelDriver

        public void PayCallBack()

        {

            Console.WriteLine("this is CMBPayChannelDriver");

        }

        public string ReplaceHtmlCode(string order_no, string order_create_time, string currency, string extra, string goods_desc)

            return "";

    /// 第三方支付驅動

    public class OtherPayChannelDriver 

        public void OtherPayCallBack()

            Console.WriteLine("this is OtherPayChannelDriver");

        public string GetReuqestUrl(string order_no, string order_create_time, string goods_desc)

    /// 擴充卡

    public class PayChannelDriverAdapter : PayChannelDriver

        OtherPayChannelDriver ocd;

        public PayChannelDriverAdapter(OtherPayChannelDriver otherpcd)

            this.ocd = otherpcd;

            ocd.OtherPayCallBack();

        public string ReplaceHtmlCode(string order_no, string order_create_time,string currency, string extra, string goods_desc)

            return ocd.GetReuqestUrl(order_no, order_create_time,goods_desc);

測試看看

          //普通銀行驅動

           PayChannelDriver pd = new CMBPayChannelDriver();

           //第三方支付不支援銀行驅動

           OtherPayChannelDriver od = new OtherPayChannelDriver();

           //擴充卡

           PayChannelDriver apd = new PayChannelDriverAdapter(od);

           //驅動支援擴充卡

           pd.PayCallBack();

           apd.PayCallBack();

總結:擴充卡模式将一個類的接口轉換成客戶期望的另一個接口。擴充卡讓原本接口不相容的類可以合作無間。

設計原則: 當你正在設計一個系統,不管是任何對象,你都要注意它所互動的類有哪些,并注意它和這些類是如何互動的。不要讓太多的類耦合在一起,免得修改系統中一部分,會影響到其他部分。如果許多類之間互相依賴,那麼這個系統就會變成一個易碎的系統,它需要花許多成本維護,也會因為太複雜而不容易被其他人了解。

下面我們再看看外觀模式

在擴充卡模式中一個擴充卡隻能夠封裝一個類嗎?擴充卡模式的工作是将一個借口轉換成另一個。雖然大多數的擴充卡模式所采取的例子都是讓一個擴充卡包裝一個被适配者,但我們都知道這個世界其實複雜多了,需要讓一個擴充卡包裝多個被适配者。這就涉及到外觀模式。

外觀模式提供一個統一的接口,用來通路子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。執行個體的話就不再贅述了。

總得來說 外觀模式基于擴充卡模式讓接口變得更簡單。

本文轉自 熬夜的蟲子  51CTO部落格,原文連結:http://blog.51cto.com/dubing/712412

繼續閱讀