将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
这么听来是不是感觉特别的神奇,其实适配器在生活中随处可见,就比如我们现在所使用的笔记本来举例子,大家都知道一般家用的插座的电压是220v,那么对于笔记本基本能够接受的电压是19V,如何能够让笔记本通电就需要用到一个适配器来使用一个输入为220V的电压转换成一个输出19V的电压到笔记本端。适配器就是将原本不适合的东西转换成我们想要的最终结果。
在开发中我们能够要与外部的厂家进行交互,有的时候我们已经开发完成的一整套系统,可会因为很多的原因致使厂家的更换 ,那么如何不改变原有的系统代码的情况下使用这个新的厂家的接口呢,那么我们就需要一个适配器要将进行类的包装。
首先我们看一来系统的类图,通过下图可以发现我们原有的系统获取的是一个文本类型的数据,而新的接口里面获取的是一个整型,如何不改变原有的接口的情况下使用新的接口,我们在需要添加一个适配器。
上图就是我们所添加的一个适配器,我们这个Adapter继续的是IInhere类,我们集成的这个类之后我们添加一个NewClass的对象,然后我们在调用IInhere的时候使用的其实是newClass这个类中的方法。
原有厂家接口:
public interface IInhere { string text { get; set; } string getText(); void setText(string text); }
class InhereClass:IInhere { public string text { get; set; } public string getText() { return text; } public void setText(string text) { this.text = text; } }
新的厂家接口:
interface INew { int number { get; set; } int getNumber(); void setNumber(int number); }
class NewClass:INew { public int number { get; set; } public int getNumber() { return this.number; } public void setNumber(int number) { this.number = number; } }
适配器代码:
class Adapter:IInhere { private NewClass newClass=new NewClass(); public string text { get; set; } public string getText() { return newClass.getNumber().ToString(); } public void setText(string text) { try { newClass.setNumber(Convert.ToInt32(text)); } catch (ArgumentException ex) { throw new ArgumentException("传入错误,请传入一个有效的数字的字符形式"); } } }
测试代码:
static void Main(string[] args) { InhereClass _inhereClass=new InhereClass(); _inhereClass.setText("10"); Console.WriteLine(_inhereClass.getText()); NewClass _iNew = new NewClass(); _iNew.setNumber(100); Console.WriteLine(_iNew.getNumber()); IInhere adapter=new Adapter(); adapter.setText("1000"); Console.WriteLine(adapter.getText()); }
结果:
我们发现原有的厂家接口用的是String类型,但是新的厂家接口用的却是Int类型,我们在其中添加一个Adapter类来进行数据的包装和处理,这样我们的系统根据不用关心新的厂家是什么类型,因为最终都会通过Adapter转换成我们想要的类型来进行相应的处理。