适配器模式(结构型)

思考问题:对于遗留系统,service已经存在了,controller层却假定service层会提供add(User u)方法新增用户,而实际上service层声明的却是insert(User u)来新增用户,在controller层和service层对接时才发现该问题,在不修改已有代码的前提下,你该如何完成对接?


解答:有两种方式:

  1. 继承;
  2. 组合(不理解可以继续看下去);

    首先讲大家熟悉的继承方式,结合问题,就是让一个适配器类UserServiceAdapter继承service层的实现类UserServiceImpl,并且实现controller层假定好的Service接口方法,当遇到方法名不一致时,只需要在实现的add(User u) 方法中调用父类insert(u)方法即可实现对接。
    这里写图片描述
    实例代码如下:
    UserServiceI假定是controller层定立的:

package com.shusheng.adapter.extend;
/**该方法是controller层假定的*/
public interface UserServiceI {
    /**添加用户*/
    public boolean add(User u);
}

UserServiceImpl假定为遗留系统已有的:

package com.shusheng.adapter.extend;
/**假设该类是遗留系统已有的*/
public class UserServiceImpl {
    /**添加用户*/
    public boolean insert(User u){
        System.out.println("这是userServiceImpl层的insert方法");
        return true;
    }
}

使用继承实现重用代码目的:

package com.shusheng.adapter.extend;
/**适配器类,实例化到controller时就使用这个类*/
public class UserServiceAdapter extends UserServiceImpl implements UserServiceI{

//  private UserServiceImpl userServiceImpl = new UserServiceImpl();继承时不需要声明

    @Override
    public boolean add(User u) {
        System.out.println("这是适配器 的add方法");
        return insert(u);//显式调用父类UserServiceImpl的insert方法
    }
}

用户类:

package com.shusheng.adapter.extend;
/**用户类*/
public class User {

}

测试程序:

package com.shusheng.adapter.extend;

public class AdapterTest {

    public static void main(String[] args) {
        UserServiceI userServiceI = new UserServiceAdapter();//完成了对接
        System.out.println(userServiceI.add(new User()));
    }
}

这里写图片描述

第二种解决方法是组合:
对于使用重用代码的方式,如果不是很强烈的is-a关系,尽量少用继承,因为继承会导致系统体系结构很复杂,不利于解耦。
组合就是在一个类中增加被组合类的一个引用,来达到显示重用代码的目的。(如果还是不能理解继续看下去)
这里写图片描述
UserServiceI类:

package com.shusheng.adapter;
/**该方法是controller层假定的*/
public interface UserServiceI {
    /**添加用户*/
    public boolean add(User u);
}

UserServiceImpl类:

package com.shusheng.adapter;
/**假设该类是遗留系统已有的*/
public class UserServiceImpl {
    /**添加用户*/
    public boolean insert(User u){
        System.out.println("这是userServiceImpl层的insert方法");
        return true;
    }
}

为了对接而设计的适配器类:

package com.shusheng.adapter;
/**适配器类,注入到controller时就使用这个类即可*/
public class UserServiceAdapter implements UserServiceI{

    private UserServiceImpl userServiceImpl = new UserServiceImpl();//组合

    @Override
    public boolean add(User u) {
        System.out.println("这是适配器 的add方法");
        return userServiceImpl.insert(u);//显式调用UserServiceImpl的insert方法
    }
}

用户类:

package com.shusheng.adapter;

public class User {

}

测试类代码:

package com.shusheng.adapter;

public class AdapterTest {

    public static void main(String[] args) {
        UserServiceI userServiceI = new UserServiceAdapter();//完成了对接
        System.out.println(userServiceI.add(new User()));
    }
}

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值