定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作
适配器模式一般分为类适配器、对象适配器、接口适配器三种,
- 类适配器是通过继承的方式来达到适配的目的,耦合度较高
- 接口适配器一般用于只需要用到接口的一部分方法的时候,我们用一抽象类来实现该接口,不想用的方法默认实现,需要用到的方法交由该抽象类的子类来实现
- 对象适配器应该算是用得最多的了,他是将被适配者对象聚合到适配器中,通过调用该对象的方法来达到方法适配的过程
在生活当中, 适配器用到的地方很多, 比如为了是手机能充电, 我们会将220V的电压通过电源适配器(充电器)转换为5V的电压; 为了使用三相插头, 我们用一个插座转接头插在两孔插座上,然后我们的三相插头就插在转接插座上,这个转接的插座其实也是一个适配器。所以正如上面定义所描述的那样, 适配器模式的主要目的就是通过“包一层的方式”,使原本不兼容的东西兼容。 放在程序语言中, 大部分情况下适配器模式就是为了以相同的调用方式去调用本来未提供该调用方式的功能模块。 类图如下:
1、场景描述
现有一个手机需要充电, 家里的电压为220V, 为了能冲上电,需要将220V的电压转换为5V。
2、实现
/// <summary>/// 被适配对象/// </summary>public class Adaptee220V{public void Show(){Console.WriteLine("这是220V电压");}}/// <summary>/// 适配器目标接口抽象/// </summary>public interface ITarget5V{/// <summary>/// 适配5V方法定义/// </summary>void Adapt5V();}/// <summary>/// 适配器/// </summary>public class Adapter5V : ITarget5V{/// <summary>/// 这里也可以通过构造函数传入/// </summary>private Adaptee220V adaptee220V = new Adaptee220V();public void Adapt5V(){adaptee220V.Show();Console.WriteLine("正在使用阻容降压电路进行转换");Console.WriteLine("得到5V电压");}}// 客户端调用ITarget5V adpter = new Adapter5V();adpter.Adapt5V();
3、优缺点
适配器模式的存在主要就是解决不兼容的问题。它符合开闭原则,因为不会修改以前的方法,仅仅是通过“包一层”来达到适配的目的,使得调用者以不变的方式来调用。 但是“包一层”就意味着复杂度加了一层,适配器模式在一定的程度上增加了复杂度和降低了可维护性。
4、应用场景
其实为了能达到不改变原有类而来达到相同的使用目的的场景都可以使用适配器模式, 比如各类数据库接口方法之间的调用适配, 适配第三方接口调用等等。 但是在我们自己的系统中,其实在一开始如果就考虑到接口的统一性的话, 那么适配器模式其实是多余的。
