设计模式 适配器模式

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

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

在这里插入图片描述
通过适配器,把 OuterUser 伪装成我们系统中一个 IUserInfo 对象

本系统的接口:

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

} 

这个接口的实现类:

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;
	 } 
} 

本系统程序运行

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

外部系统的接口:

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

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

@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 类源码,也就是
我们的适配器:接口实现的是本系统的接口

@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; 
 } 
}

运行:

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(); 
 } 
 
 } 
}

相关推荐

  1. 设计模式适配器模式

    2024-03-20 11:22:06       46 阅读
  2. 设计模式——适配器模式

    2024-03-20 11:22:06       34 阅读
  3. 设计模式-适配器模式

    2024-03-20 11:22:06       30 阅读
  4. 设计模式——适配器模式

    2024-03-20 11:22:06       27 阅读
  5. 设计模式-适配器模式

    2024-03-20 11:22:06       27 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 11:22:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 11:22:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 11:22:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 11:22:06       20 阅读

热门阅读

  1. clickhouse使用心得

    2024-03-20 11:22:06       33 阅读
  2. Day23 二叉树09

    2024-03-20 11:22:06       19 阅读
  3. SQL的ON DUPLICATE KEY UPDATE使用方法

    2024-03-20 11:22:06       21 阅读
  4. 写了几个难一点的sql

    2024-03-20 11:22:06       18 阅读
  5. 部署dagu_1.12.10+replicadb0.15.1+sqlline1.12

    2024-03-20 11:22:06       19 阅读
  6. accessToken

    2024-03-20 11:22:06       17 阅读
  7. 理解C#和.NET的应用模型

    2024-03-20 11:22:06       22 阅读
  8. 拌合楼管理系统(七) 海康威视摄像头视频预览

    2024-03-20 11:22:06       19 阅读
  9. vue将中国标准时间转成年月日

    2024-03-20 11:22:06       16 阅读
  10. vue组件

    vue组件

    2024-03-20 11:22:06      18 阅读
  11. vue3 使用element-plus 如何再次封装table组件

    2024-03-20 11:22:06       19 阅读
  12. React——组件通讯

    2024-03-20 11:22:06       19 阅读