适配器模式(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()方法"); } }
.NET中的DataAdapter就是适配器。但适配器往往只是在实在没有办法的时候才使用,比如像复用旧的类,想使用第三方的类但又不愿跟随第三方的设计,即在双方都不容易修改为统一格式的情况下,再使用适配器。如果是自己设计两个类,当然是要直接设计成两者可以配合。
《大话设计模式》中还提到了扁鹊的故事,真是很好的例子: