思考问题:对于遗留系统,service已经存在了,controller层却假定service层会提供add(User u)方法新增用户,而实际上service层声明的却是insert(User u)来新增用户,在controller层和service层对接时才发现该问题,在不修改已有代码的前提下,你该如何完成对接?
解答:有两种方式:
- 继承;
- 组合(不理解可以继续看下去);
首先讲大家熟悉的继承方式,结合问题,就是让一个适配器类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()));
}
}
时间: 2024-10-12 15:41:25