结构型模式—适配器模式

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

 

  适配器模式角色:

    ◊ 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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值