适配器模式有两种类型,类适配器模式和对象适配器模式。因为类适配器模式经过多重继承对一个接口与另外一个接口进行匹配,而C#、java等语言都不支持多重继承,于是这里只是介绍对象适配器。java
将一个类的接口变换成客户端所期待的另外一种接口,从而使本来因接口不匹配而没法在一块儿工做的两个类可以在一块儿工做。ide
举个栗子,假如我如今有钱了,去巴厘岛去旅游。当地提供的住宿环境是那种欧式的插线板,但我手机充电器是中国通用的那种两个插线头。在这种状况下我手机已经没电了必需要充电,担我直接充不了怎么办。去当地的超市买来了一个转接头,拿回住的地方用转接头就能够充电了。网上这张图给我启发很大以下spa
转接头(Adapter模式)使得本来因为插头与线板(接口)不兼容而不能一块儿充电(工做)的那些线(类)能够在一块儿工做。code
公司如今是作本身产品(速),可是老板发现一个新的商机又开发出来一个新的产品(玩)。但愿在(玩)产品上同事能够看到(速)产品中的用户。但因为两个产品不是同一技术团队研发的。在技术与开发规范中都不是很统一。适配器模式就是要解决这样的问题对象
代码清单:(玩)用户信息接口继承
public interface IUserInfo { public String getUserName(); public String getUserPhone(); public String getUserJobPosition(); }
代码清单:(玩)用户信息实现方法接口
public class UserInfo implements IUserInfo { @Override public String getUserName() { System.out.println("张三"); return null; } @Override public String getUserPhone() { System.out.println("15811111111"); return null; } @Override public String getUserJobPosition() { System.out.println("CEO"); return null; } }
代码清单:(速)用户信息实现方法开发
public class Perpersonnel { public Map getUserBasic(){ HashMap<Object, String> userBasic = new HashMap<Object, String>(); userBasic.put("UserName","王五"); userBasic.put("UserPhone","18811111111"); return userBasic; } public Map getUserJob(){ HashMap<Object, String> userJobPosition = new HashMap<Object, String>(); userJobPosition.put("JobPosition","CTO"); return userJobPosition; } }
代码清单:主角适配器get
public class UserInfoAdapter extends Perpersonnel implements IUserInfo{ public String getUserName() { String userName = (String) getUserBasic().get("UserName"); System.out.println(userName); return userName; } public String getUserPhone() { String UserPhone = (String) getUserBasic().get("UserPhone"); System.out.println(UserPhone); return UserPhone; } public String getUserJobPosition() { String JobPosition = (String) getUserJob().get("JobPosition"); System.out.println(JobPosition); return JobPosition; } }
代码清单:(玩)产品上查询两个产品的用户信息产品
public class Test { public static void main(String[] args) { IUserInfo iuserInfo = new UserInfo(); iuserInfo.getUserName(); iuserInfo.getUserPhone(); iuserInfo.getUserJobPosition(); System.out.println("---------------------"); IUserInfo iuserInfoAdapter = new UserInfoAdapter(); iuserInfoAdapter.getUserName(); iuserInfoAdapter.getUserPhone(); iuserInfoAdapter.getUserJobPosition(); } }
查询出来的结果以下:
张三 15811111111 CEO --------------------- 王五 18811111111 CTO
优势
缺点
适配器模式的使用场景主要记住一点就足够了:你想修改一个已经投产中的接口時,适配器模式多是最适合你的模式。