結構型模式—適配器模式

適配器模式將一個類的接口轉換成客戶希望的另外一個接口。使得原本不相容的接口可以協同工作。
適用性:想使用一個已經存在的類,而它的接口不符合你的需求。
想創建一個可以複用的類, 該類可以與其他不相關的類或不可預見的類(即那些接口可能
不一定兼容的類)協同 工作。

 

  適配器模式角色:

    ◊ ITarget:Client所使用的與特定領域相關的接口。

    ◊Client:與符合ITarget接口的對象協調的類。

    ◊Adaptee:需要適配的類接口。

    ◊Adapter:適配器,負責Adaptee的接口與ITarget接口進行適配。

    在適配器模式中,類Adapter實現適配器的功能,它在Client於Adaptee之間加入Adapter,這樣Client把請求發給接口爲ITarget的類Adapter,再由Adapter調用Adaptee,從而實現Client調用Adaptee。


    結構圖



支付後接口使用適配器模式轉換對象結構圖


namespace Libraries.Test.DesignPattern.Adapter
{
    /// <summary>
    /// 付款之後處理統一接口
    /// </summary>
    public interface IPayAfter
    {
        PayAfterModel Request();
    }
}
namespace Libraries.Test.DesignPattern.Adapter
{
    /// <summary>
    /// 將支付寶付款後參數轉換成統一付款的參數(對象適配器模式)
    /// </summary>
    public class AlipayPayAfter : IPayAfter
    {
        private readonly AlipayPay alipayPay = new AlipayPay();
        public PayAfterModel Request()
        {
            AlipayPayModel alipayPayModel = alipayPay.SpecificRequest();
            return new PayAfterModel()
            {
                OrderNo = alipayPayModel.OrderNo,
                PayAmt = decimal.Parse(alipayPayModel.Amt),
                OutTradeNo = alipayPayModel.TradeId
            };
        }
    }

    /// <summary>
    /// 將支付寶付款後參數轉換成統一付款的參數(類適配器模式)
    /// </summary>
    //public class AlipayPayAfter : AlipayPay, IPayAfter
    //{
    //    public PayAfterModel Request()
    //    {
    //        AlipayPayModel alipayPayModel = SpecificRequest();
    //        return new PayAfterModel()
    //        {
    //            OrderNo = alipayPayModel.OrderNo,
    //            PayAmt = decimal.Parse(alipayPayModel.Amt),
    //            OutTradeNo = alipayPayModel.TradeId
    //        };
    //    }
    //}

}
namespace Libraries.Test.DesignPattern.Adapter
{
    /// <summary>
    /// 將微信付款後參數轉換成統一付款的參數(類適配器模式)
    /// </summary>
    public class WechatPayAfter : WechatPay, IPayAfter
    {
        public PayAfterModel Request()
        {
            WechatPayModel wechatPayModel = SpecificRequest();
            return new PayAfterModel()
            {
                OrderNo = wechatPayModel.OrderNo,
                PayAmt = wechatPayModel.TotalFee / 100,
                OutTradeNo = wechatPayModel.TransactionId
            };
        }
    }
}
namespace Libraries.Test.DesignPattern.Adapter
{
    /// <summary>
    /// 支付寶付款後返回對象
    /// </summary>
    public class AlipayPay
    {
        public AlipayPayModel SpecificRequest()
        {
            return new AlipayPayModel()
            {
                OrderNo = "20180102Adew",
                Amt = "25.52",
                TradeId = "4002154215411",
            };
        }
    }
}
namespace Libraries.Test.DesignPattern.Adapter
{
    /// <summary>
    /// 微信付款後返回對象
    /// </summary>
    public class WechatPay
    {
        public WechatPayModel SpecificRequest()
        {
            return new WechatPayModel()
            {
                OrderNo = "20180102Adew",
                TotalFee = 999,
                TransactionId = "4002115411111221211",
            };
        }
    }
}

namespace Libraries.Test.DesignPattern.Adapter
{
    /// <summary>
    /// 付款之後處理對象
    /// </summary>
    public class PayAfterModel
    {
        /// <summary>
        /// 訂單號
        /// </summary>
        public string OrderNo { get; set; }

        /// <summary>
        /// 支付金額
        /// </summary>
        public decimal PayAmt { get; set; }

        /// <summary>
        /// 外部交易號
        /// </summary>
        public string OutTradeNo { get; set; }
    }

    /// <summary>
    /// 支付寶付款後返回對象
    /// </summary>
    public class AlipayPayModel
    {
        /// <summary>
        /// 商戶訂單號
        /// </summary>
        public string OrderNo { get; set; }

        /// <summary>
        /// 支付寶交易賬號
        /// </summary>
        public string TradeId { get; set; }

        /// <summary>
        /// 金額(小數點保留兩位)
        /// </summary>
        public string Amt { get; set; }
    }

    /// <summary>
    /// 支付寶付款後返回對象
    /// </summary>
    public class WechatPayModel
    {
        /// <summary>
        /// 商戶訂單號
        /// </summary>
        public string OrderNo { get; set; }

        /// <summary>
        /// 微信支付訂單號
        /// </summary>
        public string TransactionId { get; set; }

        /// <summary>
        /// 訂單金額(單位爲分)
        /// </summary>
        public int TotalFee { get; set; }
    }
}
namespace Libraries.Test.DesignPattern.Adapter
{
    public class Client
    {
        public void Excute()
        {
            //PayAfterModel對象通過適配器模式轉換PayAfterModel對象
            IPayAfter payAfter = new AlipayPayAfter();
            PayAfterModel payAfterModel = payAfter.Request();

            //WechatPayModel對象通過適配器模式轉換PayAfterModel對象
            payAfter = new WechatPayAfter();
            payAfterModel = payAfter.Request();
        }
    }
}
發佈了62 篇原創文章 · 獲贊 129 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章