1.为什么要使用适配器模式
假如我现在的系统运行良好,突然要和第三方公司的业务进行整合,比如我有一个User接口,里面定义了获取手机号,姓名等方法。但是第三方也有User接口,它只定义了获取用户信息的接口。那么我们就可以在自己系统和第三方系统之间新加一个适配器,让第三方信息能够无缝接入。
2.类图
3.实现
//自己本系统的接口
public interface User {
String getUserName();
String getMobile();
}
//第三方的实现类
public class OuterUser {
public Map<String, String> getUserInfo(){
Map<String, String> map = new HashMap<>();
map.put("name","某某");
map.put("mobile","12345678900");
map.put("address","幸福路123号");
return map;
}
}
//适配器,在第三方系统和自己系统之间
public class UserAdapter extends OuterUser implements User{
@Override
public String getUserName() {
return super.getUserInfo().get("name");
}
@Override
public String getMobile() {
return super.getUserInfo().get("mobile");
}
}
main方法
/**
* 适配器模式
*/
public class Main {
public static void main(String[] args) {
//这样即使接入了第三方也能符合自己系统的调用标准
User user = new UserAdapter();
user.getMobile();
user.getUserName();
}
}
以上是类适配器,如果第三方对于User有两个不同功能的类,一个是获得用户姓名的Map方法,一个是获得用户手机的Map方法,怎么办?java不支持多继承啊。于是有了下面的对象适配器。(上面的叫做类适配器)。
4.对象适配器
既然不能多继承,那我直接让你成为我的私有变量不就行了,因此也叫做对象适配器,就是把上的的UserAdapter改成如下即可
public class UserAdapter2 implements User{
private OuterUser outerUser = new OuterUser();
//简便起见,下面这个类就不写了
//private OuterUser2 outerUser2 = new OuterUser2();
@Override
public String getUserName() {
return outerUser.getUserInfo().get("name");
}
@Override
public String getMobile() {
return outerUser.getUserInfo().get("mobile");
//假设mobile是由下面这个第三方的类实现的
//return outerUser2.getUserInfo().get("mobile");
}
}