目的
适配器模式为了把不符合的接口实现,转换为调用方期待的接口。
类图
实战案例
比如我的项目中,原来的一部分业务数据查询的是数据库,现在需要改为Hsqldb查询。原来的代码结构如下:
代码
原来的数据操作接口DbDao:
package com.puhui.goosecard.web;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/9/5 11:22
* 4
*/
public interface DbDao {
void insertDb();
}
原来的数据库接口实现类DbDaoImpl:
package com.puhui.goosecard.web;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/9/5 11:22
* 4
*/
public class DbDaoImpl implements DbDao {
@Override
public void insertDb() {
}
}
新采用的hsqldb操作接口:
package com.puhui.goosecard.web;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/9/5 11:37
* 4
*/
public interface HsqlDao {
void insertHsql();
}
新采用的hsqldb接口实现类:
package com.puhui.goosecard.web;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/9/5 11:25
* 4
*/
public class HsqlDaoImpl implements HsqlDao{
@Override
public void insertHsql() {
}
}
调用方:
package com.puhui.goosecard.web;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/9/5 11:28
* 4
*/
public class Client {
//如果改为hsql,调用方需要修改接口,为了不影响,我们采用适配器模式,让hsqldao实现dbdao接口
private DbDao dbDao;
}
关键点:
- 为了采用hsqldbdao实现类,并且不影响原来的调用,必需实现DbDao接口。
- 实现DbDao接口后,通过对象组合引用,调用hsqldb的逻辑。这个部分和代理模式有些类似,但是代理模式并没有实现新的接口。
- 实例代码中只是简单写了insert方法,如果是query等方法,还需要进行对象的转换操作。