设计模式 适配器模式

1.背景

适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换为你需要的 36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢

2.B接口转换为 A 接口,怎么办?继承,能解决,但是比较傻

通过适配器,把 OuterUser 伪装成我们系统中一个 IUserInfo 对象

本系统的接口:

cpp 复制代码
public interface IUserInfo { 
 
	//获得用户姓名
	public String getUserName(); 
	 
	//获得家庭地址
	public String getHomeAddress(); 
	 
	//手机号码,这个太重要,手机泛滥呀
	public String getMobileNumber(); 
	 
	//办公电话,一般式座机
	public String getOfficeTelNumber(); 
	 
	//这个人的职位是啥
	public String getJobPosition(); 
	 
	//获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作
	public String getHomeTelNumber(); 

} 

这个接口的实现类:

cpp 复制代码
public class UserInfo implements IUserInfo { 
	/* 
	 * 获得家庭地址,下属送礼也可以找到地方
	*/
	public String getHomeAddress() { 
		 System.out.println("这里是员工的家庭地址...."); 
		 return null; 
	 } 
	/* 
	 * 获得家庭电话号码
	 */
	public String getHomeTelNumber() { 
		 System.out.println("员工的家庭电话是...."); 
		 return null; 
	 } 
	/* 
	 * 员工的职位,是部门经理还是小兵
	 */
	public String getJobPosition() { 
		 System.out.println("这个人的职位是BOSS...."); 
		 return null; 
	 } 
	/* 
	 * 手机号码
	 */
	public String getMobileNumber() { 
		 System.out.println("这个人的手机号码是0000...."); 
		 return null; 
	 } 
	/* 
	 * 办公室电话,烦躁的时候最好"不小心"把电话线踢掉,我经常这么干,对己对人都有好处
	 */
	public String getOfficeTelNumber() { 
		 System.out.println("办公室电话是...."); 
		 return null; 
	 } 
	/* 
	 * 姓名了,这个老重要了
	 */
	public String getUserName() { 
		 System.out.println("姓名叫做..."); 
		 return null;
	 } 
} 

本系统程序运行

cpp 复制代码
public class App { 
	public static void main(String[] args) { 
		 //没有与外系统连接的时候,是这样写的
		 IUserInfo youngGirl = new UserInfo(); 
		 //从数据库中查到101个
		 for(int i=0;i<101;i++){ 
			 youngGirl.getMobileNumber(); 
		 }  
	} 
}

外部系统的接口:

cpp 复制代码
@SuppressWarnings("all") 
public interface IOuterUser { 
 
	//基本信息,比如名称,性别,手机号码了等
	public Map getUserBaseInfo(); 
	 
	//工作区域信息
	public Map getUserOfficeInfo(); 
	 
	//用户的家庭信息
	public Map getUserHomeInfo(); 
 
}

外部系统的接口的实现类:

cpp 复制代码
@SuppressWarnings("all") 
public class OuterUser implements IOuterUser { 
	/* 
	 * 用户的基本信息
	 */
	public Map getUserBaseInfo() { 
		 HashMap baseInfoMap = new HashMap(); 
		 
		 baseInfoMap.put("userName", "这个员工叫混世魔王...."); 
		 baseInfoMap.put("mobileNumber", "这个员工电话是....");
		 return baseInfoMap; 
	 } 
	/* 
	 * 员工的家庭信息
	 */
	public Map getUserHomeInfo() { 
		 HashMap homeInfo = new HashMap(); 
		 
		 homeInfo.put("homeTelNumbner", "员工的家庭电话是...."); 
		 homeInfo.put("homeAddress", "员工的家庭地址是...."); 
		 
		 return homeInfo; 
	 } 
	/* 
	 * 员工的工作信息,比如职位了等
	 */
	public Map getUserOfficeInfo() { 
		 HashMap officeInfo = new HashMap(); 
		 
		 officeInfo.put("jobPosition","这个人的职位是BOSS..."); 
		 officeInfo.put("officeTelNumber", "员工的办公电话是...."); 
		 
		 return officeInfo; 
	 } 
}

外系统的用户信息包装成我们公司的人员信息呢?看下面的 OuterUserInfo 类源码,也就是

我们的适配器:接口实现的是本系统的接口

cpp 复制代码
@SuppressWarnings("all") 
public class OuterUserInfo extends OuterUser implements IUserInfo { 
 
private Map baseInfo = super.getUserBaseInfo(); //员工的基本信息
private Map homeInfo = super.getUserHomeInfo(); //员工的家庭 信息
private Map officeInfo = super.getUserOfficeInfo(); //工作信息
 
/* 
 * 家庭地址
 */
public String getHomeAddress() { 
 String homeAddress = (String)this.homeInfo.get("homeAddress"); 
 System.out.println(homeAddress); 
 return homeAddress; 
 } 
/* 
 * 家庭电话号码
 */
public String getHomeTelNumber() { 
 String homeTelNumber = (String)this.homeInfo.get("homeTelNumber"); 
 System.out.println(homeTelNumber); 
 return homeTelNumber; 
 } 
/* 
 *职位信息
 */
public String getJobPosition() { 
 String jobPosition = (String)this.officeInfo.get("jobPosition"); 
 System.out.println(jobPosition); 
 return jobPosition; 
 } 
/* 
 * 手机号码
 */
public String getMobileNumber() { 
 String mobileNumber = (String)this.baseInfo.get("mobileNumber"); 
 System.out.println(mobileNumber); 
 return mobileNumber; 
 } 
/*
* 办公电话
 */
public String getOfficeTelNumber() { 
 String officeTelNumber = (String)this.officeInfo.get("officeTelNumber"); 
 System.out.println(officeTelNumber); 
 return officeTelNumber; 
 } 
/* 
 * 员工的名称
 */
public String getUserName() { 
 String userName = (String)this.baseInfo.get("userName"); 
 System.out.println(userName); 
 return userName; 
 } 
}

运行:

cpp 复制代码
public class App { 
public static void main(String[] args) { 
 //没有与外系统连接的时候,是这样写的
 //IUserInfo youngGirl = new UserInfo();
 
 //老板一想不对呀,兔子不吃窝边草,还是找人力资源的员工好点
 IUserInfo youngGirl = new OuterUserInfo(); //我们只修改了这一句好   OuterUserInfo  是适配器
 //从数据库中查到101个
 for(int i=0;i<101;i++){ 
 youngGirl.getMobileNumber(); 
 } 
 
 } 
}
相关推荐
思忖小下8 小时前
梳理你的思路(从OOP到架构设计)_简介设计模式
设计模式·架构·eit
liyinuo201710 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
aaasssdddd9612 小时前
C++的封装(十四):《设计模式》这本书
数据结构·c++·设计模式
T1an-112 小时前
设计模式之【观察者模式】
观察者模式·设计模式
思忖小下14 小时前
梳理你的思路(从OOP到架构设计)_设计模式Factory Method模式
设计模式·工厂方法模式·eit
霁月风15 小时前
设计模式——工厂方法模式
c++·设计模式·工厂方法模式
发飙的蜗牛'17 小时前
23种设计模式
android·java·设计模式
NorthCastle1 天前
设计模式-创建型模式-简单工厂模式详解
设计模式·简单工厂模式
越甲八千1 天前
重拾设计模式-外观模式和适配器模式的异同
设计模式·适配器模式·外观模式
越甲八千1 天前
重拾设计模式--适配器模式
设计模式·适配器模式