标签:继承 目标接口 必须 缺点 特殊 ase public read adp
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
模式中的角色:
适配器模式有类的适配器模式和对象的适配器模式两种形式,下面我们分别讨论这两种形式的实现
具体实现代码如下:
/// <summary> /// 目标接口(C#不支持类的多继承,故此处定义为接口) /// </summary> public interface ITarget { void Request(); } /// <summary> /// 定义需要适配的类 /// </summary> public class Adaptee { public void SpecificRequest() { Console.WriteLine("This is a special request."); } } /// <summary> /// 定义适配器,继承适配的类和目标接口 /// </summary> public class PowerAdapter_Class : Adaptee, ITarget { /// <summary> /// 实现目标接口方法 /// </summary> public void Request() { this.SpecificRequest(); } } /// <summary> /// 客户端调用 /// </summary> static void Main(string[] args) { ITarget target = new PowerAdapter_Class(); target.Request(); Console.ReadLine(); }
从上面代码中可以看出,客户端希望调用Request方法(即三个孔插头),但是我们现有的类(即2个孔的插头)并没有Request方法,它只有SpecificRequest方法(即两个孔插头本身的方法),然而适配器类(适配器必须实现三个孔插头接口和继承两个孔插头类)可以提供这种转换,它提供了Request方法的实现(其内部调用的是两个孔插头,因为适配器只是一个外壳罢了,包装着两个孔插头(因为只有这样,电器才能使用),并向外界提供三个孔插头的外观,)以供客户端使用,对应类图如下:
具体实现代码如下:
/// <summary> /// 适配器模式中的目标(Target)角色 /// </summary> public class Target { /// <summary> /// 使用virtual修饰以便子类可以重写 /// </summary> public virtual void Request() { Console.WriteLine("This is a common request"); } } /// <summary> /// 定义需要适配的类 /// </summary> public class Adaptee { public void SpecificRequest() { Console.WriteLine("This is a special request."); } } /// <summary> /// 定义适配器继承目标类 /// </summary> public class PowerAdapter_Object : Target { public Adaptee adaptee = new Adaptee(); public override void Request() { adaptee.SpecificRequest(); } } /// <summary> /// 客户端调用 /// </summary> static void Main(string[] args) { Target target = new PowerAdapter_Object(); target.Request(); Console.ReadLine(); }
一目了然,在适配器类中创建需要适配的对象,并通过对象调用指定方法以达到适配的目的。对应类图如下:
类的适配器模式:
优点:
缺点:
对象的适配器模式:
优点:
缺点:
在以下情况下可以考虑使用适配器模式:
.NET中的一个重要适配器模式的应用就是DataAdapter。ADO.NET为统一的数据访问提供了多个接口和基类,其中最重要的接口之一是IdataAdapter。DataAdpter起到了数据库到DataSet桥接器的作用,使应用程序的数据操作统一到DataSet上,而与具体的数据库类型无关。甚至可以针对特殊的数据源编制自己的DataAdpter,从而使我们的应用程序与这些特殊的数据源相兼容。
标签:继承 目标接口 必须 缺点 特殊 ase public read adp
原文地址:http://www.cnblogs.com/snaildev/p/7610426.html