一、产生背景
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
二、一般的做法
Target:Client所使用的与特定领域相关的接口。
Client:与符合Target接口的对象协调的类。
Adaptee:需要适配的类接口。
Adapter:适配器,负责Adaptee的接口与Target接口进行适配。
在适配器模式中,类Adapter实现适配器的功能,它在Client于Adaptee之间加入Adapter,这样Client把请求发给接口为Target的类Adapter,再由Adapter调用Adaptee,从而实现Client调用Adaptee。
三、实例(以下包含类适配器和对象适配器)
1、接口定义
public interface ITarget { void Request(); } public class Target : ITarget//对象需要 { public virtual void Request() { Console.WriteLine("Called Target Request()"); } }
2、适配者
public class Adaptee { public void SpecificRequest() { Console.WriteLine("Called SpecificRequest()"); } }
3、适配器
public class Adapter : Adaptee, ITarget { public void Request() { this.SpecificRequest(); } } public class Adapter2 : Target { private Adaptee _adaptee = new Adaptee(); public override void Request() { _adaptee.SpecificRequest(); } }
4、客户端调用
class Program { static void Main(string[] args) { //类适配器 ITarget t = new Adapter(); t.Request(); //对象适配器 ITarget t2 = new Adapter(); t2.Request(); Console.ReadLine(); } }
四、设计模式分析
优点: 1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾 难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。