适配器模式

转自: https://www.cnblogs.com/tianzhiliang/archive/2011/09/29/2195664.html 

 

  Target 类(Target 类代表能够被客户端使用的接口):

namespace Adapter 
{ 
    public abstract class Target 
    { 
        //温度 
        /// <summary> 
        /// 下面的接口才是可以被客户端所识别的接口,也就是目标接口 
        /// 而前面在被适配器类中的中文却不能被客户端识别,需要被适配 
        /// </summary> 
        public abstract void GetTemperature();
        //气压 
        public abstract void GetPressure();
        //湿度 
        public abstract void GetHumidity();
        //紫外线强度 
        public abstract void GetUltraviolet(); 
    } 
}
  被适配的类 Adaptee(Adaptee 中的接口由于不能被客户端识别,所以需要被适配):

using System;
namespace Adapter 
{ 
    class Adaptee 
    { 
        /// <summary> 
        /// 在被适配器类中的接口并不是客户端需要的接口 
        /// 比如这里是使用的中文,而我在客户端却必须要使用英文 
        /// 所以在这里我必须使用适配器来适配 
        /// </summary> 
        public void 得到温度() 
        { 
            Console.WriteLine("您得到了今日的温度"); 
        }
        public void 得到气压() 
        { 
            Console.WriteLine("您得到了今日的气压"); 
        }
        public void 得到湿度() 
        { 
            Console.WriteLine("您得到了今日的湿度"); 
        }
        public void 得到紫外线强度() 
        { 
            Console.WriteLine("您得到了今日的紫外线强度"); 
        } 
    } 
}
  适配器(适配器将不能被客户端识别的接口间接转换为可以被识别的接口):

namespace Adapter 
{ 
    public class Adapter:Target 
    { 
        //在适配器中必须要维护一个被适配器类的对象 
        private Adaptee adaptee = new Adaptee();
        /// <summary> 
        /// 通过适配器来适配原来不能被客户端所认识的接口 
        /// </summary> 
        public override void GetTemperature() 
        { 
            adaptee.得到温度(); 
        }
        public override void GetPressure() 
        { 
            adaptee.得到气压(); 
        }
        public override void GetHumidity() 
        { 
            adaptee.得到湿度(); 
        }
        public override void GetUltraviolet() 
        { 
            adaptee.得到紫外线强度(); 
        } 
    } 
}
  客户端:

using System;
namespace AdapterTest 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            //实例化一个适配器给目标接口 
            Adapter.Target target = new Adapter.Adapter();
            //下面的这些就是客户端可以被识别了接口了
            target.GetTemperature(); 
            target.GetPressure(); 
            target.GetHumidity(); 
            target.GetUltraviolet();
            Console.ReadKey(); 
        } 
    } 
}
  可以看出,上面的适配器就是一个中介人,它把本来客户端的请求转换成了 Adaptee 所代表的接口所能理解的请求。或者说是,把本来客户端不认识的 Adaptee 间接介绍给了客户端认识,不过注意是间接。

  适配器模式在 . NET 中的应用:

  使用过 ADO.NET 等数据访问之类的操作的话,应该都使用过 DataAdapter。DataAdapter 的主要作用是用来在 DataSet 和数据源之间提供一个适配器功能来实现检索和保存数据。因为数据源有可能是 DB2 ,SqlServer ,Oracle 等,而这些数据库的数据在组织上都有一定的差别,所以,它们的接口单单对于 DataSet 来说的话,是有区别的,而且区别还比较大,而我们总不可能针对每一种数据库都使用不同的 DataSet 来保存和检索数据吧,我们希望的是提供一种统一的 DataSet ,而其既可以对 Oracle 使用,又可以对 DB2 等等数据库使用,也就是一种通用的 DataSet 类型。所以在这里面便可以使用适配器模式了,我们在数据源和 DataSet 之间插入一个适配器 DataAdapter ,通过适配器来实现对各种数据库的不同应用(提供给客户端统一接口),而在 DataSet 中,其只能看到 DataAdapter 这一层,对于数据源的话,它是不需要过问的,这样也就是实现了一种通用的 DataSet。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值