适配器模式将一个类的接口转换成客户希望的另外一个接口。使得原本不相容的接口可以协同工作。
适用性:想使用一个已经存在的类,而它的接口不符合你的需求。
想创建一个可以复用的类, 该类可以与其他不相关的类或不可预见的类(即那些接口可能
不一定兼容的类)协同 工作。
适配器模式角色:
◊ 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();
}
}
}