设计模式---适配器模式

2014-11-24 10:11:45 · 作者: · 浏览: 1

适配器模式,是我们经常用的模式之一。其主要作用就是将一些不兼容的类,包装成符合我们定义的接口。其实这种实现方式,用的原理就是IOC和AOP的思想,说白了,就是依赖注入,将不兼容的类通过各种方式注入到我们定义的接口中,然后在我们的接口实现类中来调用不兼容类的一些方法,在很多程序员的工作中,维护旧系统其实也是一项比较多的工作,如果需要在原有的一些方法上加逻辑,建议不要直接修改原来的文件,我们可以使用适配器模式来做。我们举个例子。

[java]


在产品设计数据管理的时候,我们经常使用ProE来进行设计,设计的数据主要有三维模型和二维图纸。我们现在已经有的方法是分别通过三维模型和二维图纸的编号来获取名称。但是现在我们希望通过传入一个编号,不论是三维模型还是二维图纸,都能自动返回名称。因此需要写一个方法,来判断当前传入的编号是三维模型的编号还是二维图纸的编号。我们可以在原有的类中来修改,但是由于以前的源文件已经丢失了,只剩下class文件,并且还打入到了jar包里,而且你还不知道在哪个jar包里,该jar包你也未必加载到了开发环境中。这种情况其实很常见,在一般维护期较长的系统中,这种情况普遍存在。当然,你可以使用各种方法来找到class文件,并且反编译,修改代码,但是你不觉得很麻烦么?而且这样做,也的确比较容易出问题。因此用适配器模式,做起来要轻松优雅的多,而且也做到了你的代码和之前代码的解耦。比较容易以后的维护。

我们来看看,以前老代码中的方法,分别根据三维模型和二维图纸的编号的来获取名称。


[java]
package com.dev.design.adapter;

public class EPMHelper {
public String get3DName(String number){
return number + "3D";
}

public String get2DName(String number){
return number + "2D";
}
}

package com.dev.design.adapter;

public class EPMHelper {
public String get3DName(String number){
return number + "3D";
}

public String get2DName(String number){
return number + "2D";
}
}


现在我们需要重新设计一个接口,来调用上面的方法。接口定义如下:


[java]
package com.dev.design.adapter;

public interface Handler {
public String getEPMName(String number);
}

package com.dev.design.adapter;

public interface Handler {
public String getEPMName(String number);
}

来看看实现。


[java
package com.dev.design.adapter;

public class EPMHandler implements Handler {

private EPMHelper helper;

public EPMHandler(EPMHelper helper) {
// TODO Auto-generated constructor stub
this.helper = helper;
}

@Override
public String getEPMName(String number) {
// TODO Auto-generated method stub
if(number == "3D"){
return helper.get3DName(number);
}
return helper.get2DName(number);
}

}

package com.dev.design.adapter;

public class EPMHandler implements Handler {

private EPMHelper helper;

public EPMHandler(EPMHelper helper) {
// TODO Auto-generated constructor stub
this.helper = helper;
}

@Override
public String getEPMName(String number) {
// TODO Auto-generated method stub
if(number == "3D"){
return helper.get3DName(number);
}
return helper.get2DName(number);
}

}

我们可以将原有的EPMHelper对象作为新实现类的成员属性,通过构造函数来传入实例,通过新的方法getEPMName()来调用之前的EPMHelper的方法,并加入自己的业务逻辑。当然,我这里只是举个例子,适配器模式的原理就是这个样子了。