UserInterface:目标角色——目标接口,系统所期待实现的目标;
UserInfo:源角色——当前已经存在的原有的实现类,即将被适配的类;
UserAdapter:适配器角色——将原有实现装换为目标接口的实现。
简单点说,适配器模式是指:定义一个类,将一个已经存在的类,转换成目标接口所期望的行为形式。
在具体的实现过程中,又可以基于其实现层次是类层次还是对象层次,将其分为类适配器和对象适配器。
一,类适配器
假设系统存在一个现有的类UserInfo:
class UserInfo { private Map<String, String> userBaseInfo; public Map getUserBaseInfo() { return userBaseInfo; } public void setUserBaseInfo(Map<String, String> userBaseInfo) { this.userBaseInfo = userBaseInfo; } }
客户端可以通过如下方式set、get员工基本信息:
public class AdapterTest { public static void main(String[] args) { UserInfo oui = new UserInfo(); Map<String, String> inUserInfo = new HashMap<String, String>() { { put("name", "corn"); put("telNumber", "170xxxxxxxx"); } }; oui.setUserBaseInfo(inUserInfo); // 原有取得员工基本信息的方式 Map<String, String> outUserInfo = oui.getUserBaseInfo(); String name = outUserInfo.get("name"); String telNumber = outUserInfo.get("telNumber"); } }
有一天,基于某种原因(也许你看着这种取数据的方式不太爽,也许是系统间数据交换的原因等),你需要按照如下接口的方式取数据:
目标员工接口:
interface UserInterface { public String getName(); public String getTelNumber(); }
那么,现在的问题是,如何将一个既定的类转换成按照目标接口的所期望的行为形式呢?
具体怎样实现呢,可以通过如下方式进行:
class UserAdapter extends UserInfo implements UserInterface { @Override public String getName() { return (String) super.getUserBaseInfo().get("name"); } @Override public String getTelNumber() { return (String) super.getUserBaseInfo().get("telNumber"); } }
二,对象适配器
class UserAdapter implements UserInterface { private UserInfo userInfo; public UserAdapter(){ } public UserAdapter(UserInfo userInfo){ this.userInfo = userInfo; } @Override public String getName() { return (String) userInfo.getUserBaseInfo().get("name"); } @Override public String getTelNumber() { return (String) userInfo.getUserBaseInfo().get("telNumber"); } }
总体而言:适配器模式是指定义一个适配器类,将一个已经存在的类,转换成目标接口所期望的行为形式。同时,一般来说,基于更多的推荐使用组合而不是继承,因此,对象适配器可能使用更多。