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