设计模式一一适配器模式

适配器模式

一、适配器模式

  • 1、  定义:把一个类的接口变换成客户端所期待的另一种接口,使得原本接口不匹配而无法在一起工作的两个类能够在一起工作。
  • 2、  理解:把N个不相关的类匹配同一个接口,客户端通过引用接口,使得形成一个公共常用的类接口。
  • 3、  适配器模式分为:①类的适配器模式。②对象的适配器模式

二、类的适配器模式

实例:使用银行卡支付的时候,客户可以选择工商银行卡支付或者建设银行卡支付,但两个银行提供不同的支付接口。

1、  类的适配器模式UML类图

 

 

2、  类的适配器模式代码实例

①   支付类代码

    //工商支付类
    public class ICBC
    {
        public void icbcPay()
        {
            Console.WriteLine("工商银行付款接口~~~~");
        }
    }

    //建设支付类
    public class CCB
    {
        public void ccbPay()
        {
            Console.WriteLine("建设银行付款接口~~~~");
        }
    }

 

②   转换代码(插销转换器)

    //适配器 插销转换代码
    public interface Ipay
    {
        void Pay();
    }

 

③   对应各种情况的转换代码

    //工商银行的插销转换
    public class ICBCApter : ICBC, Ipay
    {
        public void Pay()
        {
            base.icbcPay();
        }
    }

    //建设银行的插销转换
    public class CCBApter : CCB, Ipay
    {
        public void Pay()
        {
            base.ccbPay();
        }
    }

④   客户端引用接口代码

namespace 适配器模式One
{
        class Program
        {
            static void Main(string[] args)
            {
                Ipay ipay = new ICBCApter();//Adapter适配器
                ipay.Pay();//输出工商银行
                Console.WriteLine("----------------------------");
                Ipay cpay = new CCBApter();
                cpay.Pay();//输出建设银行
                Console.Read();
            }
         }
}

 3、实例UML类图(此类图由VS2012自动生成)

  

 

三、对象的适配器模式

1、  对象的适配器模式代码实例

①   支付类代码

    //工商支付类
    public class ICBC
    {
        public void icbcPay()
        {
            Console.WriteLine("工商银行接口付款~~~~");
        }
    }
    //建设支付类
    public class CCB
    {
        public void ccbPay()
        {
            Console.WriteLine("建设银行接口付款~~~~");
        }
    }

 

②   适配器代码

    //适配器 插销转换代码
    public interface Ipay
    {
        void Pay();
    }

 

③   对应各种情况,通过适配器使用的代码

    //工商银行的插销转换
    //适配器类,这里适配器类没有ICBC类,
    //而是引用了ICBC对象,所以是对象的适配器模式的实现
    public class ICBCApter : Ipay
    {
        ICBC icbc = new ICBC();
        public void Pay()
        {
            icbc.icbcPay();
        }
    }
    //建设银行的插销转换
    public class CCBApter : CCB, Ipay
    {
        CCB ccb = new CCB();
        public void Pay()
        {
            ccb.ccbPay();
        }
    }

 

④   客户端代码

namespace 适配器模式_对象的适配器模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Ipay pay = new ICBCApter();
            pay.Pay();
            Console.WriteLine("-------------------------");
            Ipay payT = new CCBApter();
            payT.Pay();
            Console.Read();
        }
    }
}

 

2、  实例UML类图(此类图由VS2012自动生成)

 

 

四、优缺点

1、  类的适配器模式

优点

①   在不修改原代码的基础上复用现有类

缺点

①   采用了“多继承”,使得耦合度较高

2、  对象的适配器模式

优点

①   采用“对象组合”方式,降低了耦合度

②   在不修改原代码的基础上复用现有类

缺点:(暂不清楚)

五、使用场景

1、  系统需要复用现有类

2、  想要建立一个可重复使用的类

posted @ 2017-03-20 21:46  微光、  阅读(343)  评论(0编辑  收藏  举报