今天,我们来说说适配器模式,所谓的适配器最贴近我们生活的就是电源适配器了,在我们的生活中,我们都知道家用额定电压是220V,但是我们的手机和笔记本等数码产品额定电压并不是220V,在我们给手机、电脑充电的时候为什么不会发生爆炸呢?那是因为我们手机充电器和电脑充电器中内置了电源适配器,把220v电压转换成我们手机和电脑所适合的电压,这样,才不会有危险发生。今天,我们就用软件的形式来实现适配器模式,首先我们先定义一个描述家用电压的类,请看代码
/// <summary> /// 具体的或抽象的类 /// </summary> class Target { public virtual void Request() { Console.WriteLine("我是额定电压220V,小心点我很危险!!"); } }
首先我们抽象出一个Target类用来代表家用额定电压,其实就是一个虚方法,然后打印一句:我是额定电压220V,小心点我很危险!!接下来,我们再定义一个手机额定电压吧,请看代码
/// <summary> /// 需要适配的类 /// </summary> class Adaptee { public void SpecificRequest() { Console.WriteLine("我是手机使用电压,手机使用我很安全哦!"); } }
好了,手机额定电压类就定义完了,接下来,就让我们请出我们今天的重要人物,适配器类,这个适配器需要有怎样的规则呢,首先,它肯定能接受家用额定电压220V,其次,它需要把220v转换为我们需要的电压,目前我们只需要手机的,所以,它要能转换成手机使用电压,所以这个类应该是这样定义的,请看代码
/// <summary> /// 适配器类 /// </summary> class Adapter : Target { private Adaptee adaptee = new Adaptee();//手机对象 public override void Request() { adaptee.SpecificRequest();//转换为使用手机额定电压 } }
首先,它在内部实例化了一个手机额定电压类,然后继承了家用220V电压抽象类,在Request方法内部通过实例化的手机额定电压实例转换为手机额定电压,到这里,我们的适配是不是就完成了,成功的把220V转换为手机需要的电压,接下来,我们来看看上端调用实现
class Program { static void Main(string[] args) { Target target = new Adapter(); target.Request(); Console.ReadLine(); } }
首先,Target类是我们被适配的类,也就是我们的目标,Adapter类就是我们的适配器类,通过 Target target = new Adapter();这行代码我们就是在实现适配的过程,就相当于把适配器插入我们的电源上,最后打开开关给我们手机充电,适配过程都是在适配器内部完成,我们可以看看运行结果,最后,我们得到的就是手机使用的电压了。。
到这里我们的手机就能安心在家里充电了,但是我们希望这个适配器不仅仅只有手机能用,还希望我的笔记本,MP3,Mp4,各种数码产品都能用这个适配器转换成满足自己的电压,那我们的这个适配器模式该怎么满足呢??
首先呢,我们共用一个适配器的话那我们的手机和电脑连接适配器的接口得一样吧,所以,首先第一步就是抽象出一个接口,请看代码
/// <summary> /// 适配者接口 /// </summary> interface IAdaptee { void SpecificRequest(); }
把我们之前的Adaptee该把改把就是我们需要的接口了,然后我们再创建一个手机适配者类和电脑适配者类,然后他们两个肯定都要继承我们创建的IAdaptee接口了,请看代码
class AdapteeCompant : IAdaptee { public void SpecificRequest() { Console.WriteLine("我是电脑使用的电压,电脑使用我很安全哦!!"); } } public class AdapteePhon : IAdaptee { public void SpecificRequest() { Console.WriteLine("我是手机使用的电压,手机使用我很安全哦!!"); } }
这两个类都实现了IAdaptee接口的SpecificRequest方法,接下来,我们还需要修改适配器类,请看代码
class Adapter : Target { private readonly IAdaptee _adaptee; public Adapter(IAdaptee adaptee) { _adaptee = adaptee; } public override void Request() { _adaptee.SpecificRequest(); } }
其实没有多大的修改,只是把我们之前的手机适配者变成了我们现在的适配者接口,通过构造函数注入的方式来引用,最后我们的Request方法用来转换,好了,现在我们的万能适配器已经做好了,接下来让我们投入使用吧
class Program { static void Main(string[] args) { AdapteePhon adapte = new AdapteePhon(); AdapteeCompant adapteeCompant = new AdapteeCompant(); Target target = new Adapter(adapte); target.Request(); Target targetcom = new Adapter(adapteeCompant); targetcom.Request(); Console.Read(); } }
首先,我们实例化一个手机,一个电脑,然后通过在实例适配器的时候把手机和电脑注入到适配器中,最后调用request方法,完成转换
到这里,我们的万能适配器就完成了呢。。。
适配器模式:将一个接口转换成客户希望的另一个接口,是接口不兼容的那些类可以一起工作。
所以,适配器模式最好的诠释了包一层的效果。