1、 信 息 科 学 与 技 术 学 院设计模式论文学生姓名 李志琴 学 号 201120990 专 业 计算机应用技术 年 级 2011 级 指导老师 葛玮 适配器模式1 引言面向对象的程序设计(OOP)是在软件工业中被视为重要典范,享誉最久的一种设计思想。它对于现在的软件工程师来说已经是一项不可或缺的基本技能。OOP之所以受到如此欢迎的一个重要原因就在于它可以让开发人员在不同的项目中共享代码,提高代码的重用率。但是在实践过程中,我们却总是遇到“ 重新发明轮子”的老问题。如何提高程序设计的效率,利用以往成功案例的经验呢? 这就要用到现在软件设计中的另一个重要的概念:设计模式(Design Pat
2、terns)。 Gof一书中是这样定义的:“对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述”。每个设计模式都集中于一个特定的面向对象设计问题或设计要点,描述了在什么时候,什么条件下使用它。因为些设计模式都是从大量的成功设计实践中总结,提炼出来的通用设计结构,所以只要我们在设计过程中善于运用这些设计模式,这将会使我们的程序具有良好的可复用性和可扩展性。 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?
3、这就是本文要说的适配器(Adapter)模式。2 适配器模式综述 2.1 定义与结构适配器模式是一种应用非常广泛的结构型设计模式。其主要意图是:将一种类的接口转换成另一种客户所希望的接口。Adapter模式使得原本因接口不兼容而无法一起工作的类可以在一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。二者的区别仅在于适配器角色对于被适配角色的适配是通过继承完成的还是通过组合来完成的。1)适配器模式的参与者:Target:目标抽象类定义Client使用的域特定领域相关的接口。Adapter:适配器类对Adaptee的接口与Target接口进行适
4、配。Adaptee:适配者类定义一个已经存在的接口,这个借口需要适配。Client:客户类与复合Target借口的对象协同。2)适配器的类图类适配器使用多重继承对一个借口与另一个接口进行匹配,如下图所示。Adapter+request ().Target+request ().Adaptee+specificRequest ().ClientspecificRequest();图 1 类适配器对象适配器依赖于对象组合,如下图所示。adapteeAdapter+request ().Adaptee+specificRequest ().Clientadaptee.specificRequest(
5、);Target+request ().图 2 对象适配器3)典型代码典型的类适配器代码:public class Adapter extends Adaptee implements Target public void request()specificRequest();典型的对象适配器代码:public class Adapter extends Targetprivate Adaptee adaptee;public Adapter(Adaptee adaptee)this.adaptee=adaptee;public void request()adaptee.specificRe
6、quest(); 2.2 适配器模式的实例与解析仿生机器人现需要设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样叫,像狗一样跑,使用适配器模式进行系统设计。DogAdapter+ cry ()move ().: void: voidRobot+ cry ()move ().: void: voidDog+ wang ()run ().: void: void图 3 仿生机器人在这一例子中,Robot、DogAdapter和Dog三者的关系是和标准适配器模式中的Tar
7、get、Adapter、Adaptee三者的关系相对应的。该例子中是用多继承使原本两个接口差异较大的被适配类相互匹配。 2.3 适配器模式优缺点类适配器模式还具有如下优点:由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。类适配器模式的缺点如下:对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。对象适配器模式还具有如下优点:一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的
8、子类都适配到目标接口。对象适配器模式的缺点如下:与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。3 结束语适配器模式虽然是一个很常用,也比较简单的模式,但通过适配器模式能够让我们从接口的角度来考虑设计问题。它集中体现了面向对象设计的原则之一:针对接口编程,而不是针对实现编程。同时适配器模式也是对“开一闭”原则(即对扩展的开发,对修改的关闭)的具体实现。设计模式为软件设计人员提供了一种提高软件系统可靠性,可维护性以及可重用性的设计思想,我们应该在设计过程中自觉运用这一思想,这样才能是我们从一个只知写代码的软件技工成长为一名软件系统设计师。