zoukankan      html  css  js  c++  java
  • 设计模式一一适配器模式

    适配器模式

    一、适配器模式

    • 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、  想要建立一个可重复使用的类

  • 相关阅读:
    DAY 5 搜索
    DAY 4 基础算法
    P2114 [NOI2014]起床困难综合症
    UVA10140 Prime Distance
    day 2 DP专场
    DAY 3 数论专场
    day 2 下午 骑士 基环树+树形DP
    day 1 晚上 P2824 [HEOI2016/TJOI2016]排序 线段树
    帝国后台加网站地图
    手风琴效果
  • 原文地址:https://www.cnblogs.com/weigaung/p/6591797.html
Copyright © 2011-2022 走看看