适配器模式

一.适配器模式

适配器模式:在不改变旧有代码的实现逻辑的同时,又将原有接口的方法进行增强或转换,去适配新的需求

二.适配器模式-示例

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

三.总结

适配器模式:就是当旧有接口中,部分方法不满足新的需求时,但其他接口满足时,可以采用适配器模式,通过实现原有接口,再去改造其中的方法,让满足需求的方法不改变原有逻辑,对不满足的方法,做新的适配修改,这样就可以在不更改源码的逻辑下,做到通用了

优点:将一个类的接口转换成另一个接口,使原本不兼容的类可以一起工作

缺点:如果有多种不同需求,就会产生多个适配器,到了后期适配器多了,维护比较麻烦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值