设计模式 适配器模式

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(); 
 } 
 
 } 
}
相关推荐
DemonAvenger12 小时前
深入Go并发编程:Goroutine性能调优与实战技巧全解析
设计模式·架构·go
啾啾Fun12 小时前
[Java基础-线程篇]7_线程设计模式与总结
java·开发语言·设计模式
Dontla14 小时前
C++设计模式总结
开发语言·c++·设计模式
JuicyActiveGilbert14 小时前
【C++设计模式】第十篇:外观模式(Facade)
c++·设计模式·外观模式
yuanpan14 小时前
23种设计模式之《装饰器模式(Decorator)》在c#中的应用及理解
设计模式·c#·装饰器模式
程序员云帆哥14 小时前
【玩转23种Java设计模式】结构型模式篇:组合模式
java·设计模式·组合模式
techzhi14 小时前
设计模式-原型模式
设计模式·原型模式
JuicyActiveGilbert15 小时前
【C++设计模式】第八篇:组合模式(Composite)
c++·设计模式·组合模式
诗水人间18 小时前
设计模式 + java8方法引用 实现任意表的过滤器
设计模式
烟锁池塘柳018 小时前
Pipeline模式详解:提升程序处理效率的设计模式
人工智能·深度学习·设计模式