首页 > 代码库 > 7 适配器模式

7 适配器模式

适配器模式(Adaptor):将一个类的接口转换成客户希望的另一个接口。适配器让原本接口不兼容的类可以一起工作。

类似于我们日常生活中的电源适配器,提供了低压直流电和220V交流电之间的适配。

适配器有两种形式:对象适配器和类适配器。两者的类图分别如下:

对象适配器:

技术分享

Adapter完成Target和Adaptee之间的适配,这里Client相当于笔记本,Target为低压直流电,Adaptee为220V交流电,Adapter为电源适配器。Adapter继承了Target,并与Adaptee关联。

再来看看类适配器是什么样的:

技术分享

类适配器与对象适配器的区别在于类适配器使用了多继承,Adapter同时继承了Target和Adaptee。但是,C#、Java等语言都不支持多继承(c++支持)。这里也就不做学习了。

对象适配器的简单代码如下,适配器用来进行迭代器(Iterator)到枚举器(Enumerator)的转换,以便让Client可以正常使用Enumerator。 

技术分享
//Client
    public class Enumerator
    {
        public bool HasMoreElements()
        {
            return true;
        }

        public object NextElement()
        {
            return new object();
        }
    }
    //Adaptee
    public class Iterator
    {
        public virtual bool HasNext()
        {
            return true;
        }

        public virtual object Next()
        {
            return new object();
        }

        public virtual void Remove(int i)
        {

        }
    }
    //Adaptor
    public class EnumeratorIteratorAdaptor : Iterator
    {
        Enumerator enumerator;
        public EnumeratorIteratorAdaptor(Enumerator enumerator)
        {
            this.enumerator = enumerator;
        }
        public override bool HasNext()
        {
            return enumerator.HasMoreElements();
        }
        public override object Next()
        {
            return enumerator.NextElement();
        }
        public override void Remove(int i)
        {
            throw new Exception("不支持Remove()方法");
        }
    }
View Code

.NET中的DataAdapter就是适配器。但适配器往往只是在实在没有办法的时候才使用,比如像复用旧的类,想使用第三方的类但又不愿跟随第三方的设计,即在双方都不容易修改为统一格式的情况下,再使用适配器。如果是自己设计两个类,当然是要直接设计成两者可以配合。

《大话设计模式》中还提到了扁鹊的故事,真是很好的例子:

技术分享

 

7 适配器模式