适配器模式

当我们要将手机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抽象类担当了设配器角色,结构图如下:

 

posted on 2012-08-22 09:40  Gates.Li  阅读(478)  评论(1编辑  收藏  举报

导航