适配器模式
当我们要将手机SD卡信息搬到电脑上要通过读卡器或者数据线,在这里读卡器和数据线担当了适配器的角色。适配器模式属于设计模式中的结构模式,作用是将已有的源类适配成我们需要的接口,供新系统使用。
适配器模式分成两种模式:类的适配器模式和对象的适配器模式。
两者的结构图如下:
对象的适配器模式 类的适配器模式
对象的适配器模式与类适配器模式的区别在于实现的时候,对象适配器是通过源委派给适配器角色实现的,而类适配器模式是通过适配器角色继承源对象实现适配的。
模式中设计到的角色
目标角色:需要适配成的目标接口,供现在系统使用。
源角色:需要被适配的源类。
适配器角色:将源角色转化成目标接口的角色。
类适配器模式示意代码:
/// <summary> /// 目标接口 /// </summary> public interface Target { void Read(); void Write(); } /// <summary> /// 源 /// </summary> public class SD { public void Read() { } public void Write() { } } /// <summary> /// 类适配器 /// </summary> public class USB:SD,Target { #region Target Members public void Target.Read() { Read(); } public void Target.Write() { Write(); } #endregion }
对象适配器模式示意图:
与类适配器模式的区别在于适配器的实现。
/// <summary> /// 对象适配器 /// </summary> public class USB:Target { private SD sd=new SD(); #region Target Members public void Target.Read() { sd.Read(); } public void Target.Write() { sd.Write(); } #endregion }
对象适配器的效果:
一个适配器可以把多种不同的源适配到同一个目标中。
什么情况下使用适配器模式?
系统需要使用现有的类,而此类的接口不符合系统的需要。
补充:缺省的适配器模式
假设已经定义好一个接口,里面定义许多方法,如果实现该接口必须实现接口中所有的方法。能不能通过一种设计有选择性的实现接口呢?这就用到缺省适配器模式。
在java sdk中就有鲜明的列子:
在窗口程序中要想窗体处理用户事件,如果实现*Listener接口,这样的话你必须实现所有的事件处理方法。如果继承*Adapter抽象类,就可以有选择性的关注某个特定的事件处理程序。
其实*Adapter抽象类担当了设配器角色,结构图如下: