一.适配器模式
适配器模式:在不改变旧有代码的实现逻辑的同时,又将原有接口的方法进行增强或转换,去适配新的需求
二.适配器模式-示例
1.新建IDao接口---有增,改,查方法
public interface IDao {
public int insert(int id, String name);
public int updateById(int id, String name);
public String selectByOne(int id);
}
2.实现IDao接口的DaoImpl实现类
public class DaoImpl implements IDao{
// 采用map模拟数据库
private Map<Integer,String> map = new HashMap<>();
@Override
public int insert(int id, String name) {
if (map.containsKey(id)){
System.out.println("已经存在该数据!");
return -1;
}else {
map.put(id,name);
System.out.println("插入数据id:"+id+",name:"+name);
return 1;
}
}
@Override
public int updateById(int id, String name) {
if (map.containsKey(id)){
map.put(id,name);
System.out.println("更新数据id:"+id+",name:"+name);
return 1;
}
System.out.println("不存在需要更新的数据");
return -1;
}
@Override
public String selectByOne(int id) {
return map.get(id);
}
}
3.创建ServiceA---业务A,仅需要增,改,查操作
// 业务A类采用原有实现
public class ServiceA {
private IDao iDao;
public ServiceA(IDao iDao) {
this.iDao = iDao;
}
public void insert(int id,String name){
iDao.insert(id,name);
}
public void updateById(int id,String name){
iDao.updateById(id, name);
}
public String selectById(int id){
return iDao.selectByOne(id);
}
}
4.创建ServiceB---业务B,对于增,改接口有新的需求,旧有实现不满足,但对于查询,旧有接口满足
// 1.需要insert方法,如果数据在数据库中不存在则插入,如果存在则做更新操作.
// 2.需要updateById方法,如果数据在数据库中存在则更新,不存在则作插入操作
// 3.查询则维持原有操作不变
// 业务B类,对于IDao接口的实现类产生了新的需求
// 1.需要insert方法,如果数据在数据库中不存在则插入,如果存在则做更新操作.
// 2.需要updateById方法,如果数据在数据库中存在则更新,不存在则作插入操作
// 3.查询则维持原有操作不变
public class ServiceB {
private IDao iDao;
public ServiceB(IDao iDao) {
this.iDao = iDao;
}
public void insert(int id,String name){
iDao.insert(id,name);
}
public void updateById(int id,String name){
iDao.updateById(id, name);
}
public String selectById(int id){
return iDao.selectByOne(id);
}
}
5.根据业务B需求,对于现有Dao进行适配
// 对于业务B的新需求做了新的适配
public class DaoAdapter implements IDao{
private DaoImpl daoImpl = new DaoImpl();
@Override
public int insert(int id, String name) {
int i = daoImpl.insert(id, name);
if (-1 == i){
i = daoImpl.updateById(id, name);
}
return i;
}
@Override
public int updateById(int id, String name) {
int i = daoImpl.updateById(id, name);
if (-1 == i){
i = daoImpl.insert(id, name);
}
return i;
}
@Override
public String selectByOne(int id) {
return daoImpl.selectByOne(id);
}
}
6.创建测试类进行测试
public class Test {
public static void main(String[] args) {
ServiceA serviceA = new ServiceA(new DaoImpl());
serviceA.insert(1,"苹果");
serviceA.insert(1,"香蕉");
serviceA.updateById(2,"橘子");
System.out.println(serviceA.selectById(1));
System.out.println("===========================");
ServiceB serviceB = new ServiceB(new DaoAdapter());
serviceB.insert(1,"苹果");
serviceB.insert(1,"香蕉");
serviceB.updateById(2,"橘子");
System.out.println(serviceB.selectById(1));
}
}
7.测试结果---业务A采用的原有实现,业务B采用的适配后的实现,即业务B不用进行代码的更改,只要构造时,传入适配后的dao就行
8.UML
三.总结
适配器模式:就是当旧有接口中,部分方法不满足新的需求时,但其他接口满足时,可以采用适配器模式,通过实现原有接口,再去改造其中的方法,让满足需求的方法不改变原有逻辑,对不满足的方法,做新的适配修改,这样就可以在不更改源码的逻辑下,做到通用了
优点:将一个类的接口转换成另一个接口,使原本不兼容的类可以一起工作
缺点:如果有多种不同需求,就会产生多个适配器,到了后期适配器多了,维护比较麻烦