C#设计模式——适配器模式

来源:互联网 发布:四川数智通软件下载 编辑:程序博客网 时间:2024/05/10 02:11
适配器模式:

大家有没有想过一个问题,电脑充电为何会有电源适配器?直接220V充电不是很快吗?答案原来在这里,笔记本工作电压很小,如果直接连接220V的电压可能会烧毁笔记本,所以我们需要一个东西来解决这个问题,那就是电源适配器。这是电源适配器,那么在软件工程中,我们又该如何用编码来实现适配器呢?这就是今天我想为大家介绍的适配器模式。
一、定义:
将一个类的接口转换成客户希望的另外一个接口。它可以使接口不兼容的类一起工作。
二、解决问题:
主要解决在软件系统中,常常要将一些“现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。
三、对象适配器优缺点:
1、优点:
  • 可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则“。
  • 采用 “对象组合”的方式,更符合松耦合。
2、缺点:
  • 使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
四、应用:
1、适配器模式结构图:

理解结构图:
根据对象适配器模式结构图,在对象适配器中,客户端需要调用request()方法,而适配者类Adaptee没有该方法,但是它所提供的specificRequest()方法却是客户端所需要的。为了使客户端能够使用适配者类,需要提供一个包装类Adapter,即适配器类。这个包装类包装了一个适配者的实例,从而将客户端与适配者衔接起来,在适配器的request()方法中调用适配者的specificRequest()方法。因为适配器类与适配者类是关联关系(也可称之为委派关系),所以这种适配器模式称为对象适配器模式。
拿我们书中的例子来说,姚明刚开始到外国,在NBA和外国教练交流,但是姚明听不懂,所以他需要一个翻译。从这里来说,教练是客户端,姚明就是那个适配者类Adaptee,但是姚明有个打篮球的方法是教练需要的,为了让教练能和姚明交流,,需要一个翻译,这个翻译就是适配器类,它包装了“翻译”这个方法,通过它,教练和姚明就接上话了,实现了交流。
2、代码展示:
//Target    class Target    {        public virtual void Request()        {            Console.WriteLine("普通请求!");        }    }    //Adaptee 需要适配的类    class Adaptee    {        public void SpecificRequest()        {            //Console.WriteLine("Called SpecificRequest()");            Console.WriteLine("特殊请求!");        }    }    //Adapter 通过在内部包装一个Adaptee对象,把源接口转换成目标接口    class Adapter : Target    {        private Adaptee adaptee = new Adaptee();//建立一个私有的Adaptee对象        public override void Request()        {            adaptee.SpecificRequest();//这样可以把表面上调用Request()方法变成实际调用SpecificRequest()        }    }    //客户端调用    class Program    {        static void Main(string[] args)        {            Target target = new Adapter();            target.Request();            Console.Read();        }    }  
3、适用情况:
(1)当系统的数据和行为都不正确,但接口不符时,我们考虑用适配器
目的:使控制范围之外的一个原有对象与某个接口匹配。
(2)在使用一个已经存在的类,但如果他的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式:两个类所做的事情相同或相似,但是具有不同的接口时使用它。
(3)双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同就用。

五、总结:
适配器模式将两个不相关的类联系起来,将接口不兼容的问题处理的很漂亮,这就是我对有关适配器模式的理解,有不合理之处,也欢迎大家提出宝贵的意见。

感谢你的阅读!
0 0