适配器模式是指"将一个类的接口转换成客户希望的另一个接口" Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.其别名为包装器.适配器模式既可以作为类结构型模式,也可以作为对象结构型模式
适配器模式无非就是“将两种没有联系的功能代码,通过中间代码相结合”
1.结构
1.1类适配器
类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图
1.2对象适配器
对象匹配依赖于对象组合
1.3适配器参与者
1.目标角色Target(类或者接口):定义Client使用特定的领域相关接口
2.Client:与符合Target接口的对象协同
3.源角色Apdatee(类或接口):定义一个已经存在的接口,这个接口需要适配
4.适配器角色Adapter(适配者类):对Adaptee的接口与Target接口进行适配
2. 实例
1.类适配器实例
国内足球俱乐部请洋教练的现象越来越普遍了,为了使教练与足球队员进行更好的沟通,需要翻译进行训练技巧的解说
1.1足球队员接口即Target
1.2洋教练即Adaptee
1.3翻译即Apdater
2.对象适配器实例
某外包公司接手了一个项目维护项目,需要开发一个FTP上传模块,原系统已定义好了FTP界面类,由于时间紧迫,开发人员需要调用自己已有的FTP上传下载方法。此方法封装在通用的类库中没有源代码.使用适配器模式,程序的结构图片如下:
FTP界面即是Target
FTP上传类、新下FTP上传类即Adaptee
FTP适配器、新FTP适配类即Adapater
适配器具备以下优势
1、适配器类、可使任何两个无直接联系的类在一起运行
2、目标角色可通过被适配者具体实现
3、适配器类,大大提高了类的复用度与灵活性
4、软件系统有使用已有类的要求,但是类的接口不合适
5、设计师需要设计一个可多次使用的类,并且与其他没有直接关系或不可知的类进行关联
6、调用现有的某些子类,无须派生它们的每个接口
示例1.类适配器
package model.adapter.classadapater;
/*
* Target 目标
*/
public interface ProduceCompany {
String getShoe();
String getDress();
}
package model.adapter.classadapater;
/*
* 被适配器
*/
public class ProduceDress {
public String getDress(){
System.out.println("--服装--");
return "dress";
}
}
package model.adapter.classadapater;
/*
* Adapter 适配器类
*/
public class ProduceShoe extends ProduceDress implements ProduceCompany{
public String getShoe(){
System.out.println("---鞋子----");
return "shoe";
}
}
示例2.对象适配器
package model.adapter.objectadapter;
/*
* Target 目标
*/
public interface ProduceCompany {
String getShoe();
String getDress();
}
package model.adapter.objectadapter;
/*
* 被适配器
*/
public class ProduceDress {
public String getDress(){
System.out.println("--服装--");
return "dress";
}
}
/*
* Adapter 适配器类 对象适配器与类适配器的区别,只是本处理用组合的方式引用被适配的类的对象
*/
public class ProduceShoe implements ProduceCompany{
private ProduceDress produceDress;
public ProduceShoe( ProduceDress produceDress){
this.produceDress = produceDress;
}
public String getShoe(){
System.out.println("---鞋子----");
return "shoe";
}
@Override
public String getDress() {
return produceDress.getDress();
}
}
Spring与Hibernate在适配器模式中的应用
当前不少IT公司运用Spring整合Hibernate进行系统的开发,对于Spring而言,它提供了HibernateDaoSupport、HibernateTemplate、HibernateCallBack等工具类湖接口来支撑Dao组件的实现
示例3.结合Spring结合HibernateDaoSupport
package model.adapter.spring;
import java.util.List;
/*
*父DAO接口
*/
public interface FatherDao {
public void saveInfo(Object object);
public void delInfo(Object object);
public Object findByNo(String no);
public List findAll();
}
package model.adapter.spring;
import java.util.List;
/*
* 通用的DAO适配器类
*/
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public abstract class FatherDaoAdapter extends HibernateDaoSupport implements FatherDao {
protected FatherDaoAdapter(){}
@Override
public void delInfo(Object object) {
getHibernateTemplate().delete(object);
}
@Override
public void saveInfo(Object object) {
getHibernateTemplate().saveOrUpdate(object);
}
public List findAll(String objeName){
String searchString = "from" + objeName;
return getHibernateTemplate().find(searchString);
}
}
package model.adapter.spring;
import java.util.List;
/*
* 登录接口
*/
public interface LoginDao extends FatherDao {
public List findByName(String name);
public List findByPassword(String password);
}
package model.adapter.spring;
import java.util.List;
public abstract class LoginDaoImpl extends FatherDaoAdapter implements LoginDao {
public static final String LOGIN = "spring.Login";
public static final String NAME = "name";
public static final String PASSWORD="password";
public List findAll(){
return super.findAll(NAME);
}
}