JAVA设计模式之 适配器模式【Adapter Pattern】

           今天上班有点点空闲时间、于是上午抽时间写了个适配器模式的Demo程序。

一、适配器的定义:

          一讲到适配器模式、我的第一反应就是想到家里的电源排插、电源排插上有两孔的、有三孔的、它能适用于不同电头插。还有 你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是220V,日本是110V,但是这个适配器能够把这些不同的电压转换为你需要的36V 电压,保证你的笔记本能够正常运行、这里是通俗的理解适配器、专业一点来讲:两个不同的接口,有不同的实现方法,但是某一天突然上帝命令你把B 接口转换为A 接口,这时怎么办?


二、适配器的通用类图:

JAVA设计模式之 适配器模式【Adapter Pattern】_第1张图片


三、我的适配器demo程序:

        程序背景:

假设A公司有一套用户管理系统,类图如下:

JAVA设计模式之 适配器模式【Adapter Pattern】_第2张图片

B公司的用户管理系统类图如下:

JAVA设计模式之 适配器模式【Adapter Pattern】_第3张图片

要求:A公司系统去调用B公司用户管理系统、将B公司系统里的用户信息获得并保存到自己的系统里用户模块中。

根据两个公司的用户模块类图我们可以发现他们的用户接口不同、如B公司是把人的信息分为了三部分:基本信息,办公信息和个人家庭信息,并且都放到了HashMap
中,这样一来,A公司的系统要和他们系统有交互,怎么办?使用适配器模式。下面是类图:

JAVA设计模式之 适配器模式【Adapter Pattern】_第4张图片


程序代码如下:

A公司用户接口:IUserInfo.java

package com.ice.adapter;
/**
 * 这是A公司用户管理模块的用户接口
 * @author [email protected]
 * 
 */
public interface IUserInfo {

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

B公司用户接口:IOuterUser.java

package com.ice.adapter;

import java.util.Map;

/**
 * 这是B公司用户模块接口、相对于A公司是外部系统人员接口
 * @author [email protected]
 * @描述  我们有发现B公司把人的信息分为了三部分:基本信息,办公信息和个人家庭信息,并且都放到了HashMap中,
 * 比如人员的姓名放到BaseInfo 信息中,家庭地址放到HomeInfo 中,
 */
public interface IOuterUser {

	//基本信息,比如名称,性别,手机号码了等
	public Map<String,String> getUserBaseInfo();
	//工作区域信息
	public Map<String,String> getUserOfficeInfo();
	//用户的家庭信息
	public Map<String,String> getUserHomeInfo();
}

B公司用户实现类:OuterUser.java

package com.ice.adapter;

import java.util.HashMap;
import java.util.Map;
/**
 * B公司(外系统)的用户信息的具体实现类
 * @author [email protected]
 *
 */
public class OuterUser implements IOuterUser {

	@Override
	public Map<String,String> getUserBaseInfo() {
		HashMap<String,String> baseInfoMap = new HashMap<String,String>();
		baseInfoMap.put("userName", "B公司小吕");
		baseInfoMap.put("mobileNumber", "13874896584");
		return baseInfoMap;
	}

	@Override
	public Map<String,String> getUserOfficeInfo() {
		HashMap<String,String> officeInfoMap = new HashMap<String,String>();
		officeInfoMap.put("officeTelNumber", "020-8888888");
		officeInfoMap.put("jobPosition", "开发小组长");
		return officeInfoMap;
	}

	@Override
	public Map<String,String> getUserHomeInfo() {
		HashMap<String,String> homeInfoMap = new HashMap<String,String>();
		homeInfoMap.put("homeTelNumber", "0734-88888888");
		homeInfoMap.put("homeAddress", "湖南省长沙市xxx");
		return homeInfoMap;
	}

}

适配器类: OuterUserInfo.java

package com.ice.adapter;

import java.util.Map;

/**
 * 这里就是一个适配器类
 * 把B公司(外系统)的用户信息包装成A公司的人员信息,然后供A公司系统调用
 * @author [email protected]
 *
 */
public class OuterUserInfo extends OuterUser implements IUserInfo {
    
	private Map<String,String> baseInfoMap = super.getUserBaseInfo();
	private Map<String,String> officeInfoMap = super.getUserOfficeInfo(); 
	private Map<String,String> homeInfoMap = super.getUserHomeInfo(); 
	
	/**
	 * 用户姓名
	 */
	@Override
	public String getUserName() {
		String userName = baseInfoMap.get("userName");
		// System.out.println("获得外系统用户姓名:"+userName);
		return userName;
	}

	/**
	 * 手机号码
	 */
	@Override
	public String getMobileNumber() {
		String mobileNumber = baseInfoMap.get("mobileNumber");
		// System.out.println("获得外系统用户手机号码:"+mobileNumber);
		return mobileNumber;
	}
	
	/**
	 * 办公电话
	 */
	@Override
	public String getOfficeTelNumber() {
		String officeTelNumber = officeInfoMap.get("officeTelNumber");
		// System.out.println("获得外系统用户办公号码:"+officeTelNumber);
		return officeTelNumber;
	}

	/**
	 * 工作职位
	 */
	@Override
	public String getJobPosition() {
		String jobPosition = officeInfoMap.get("jobPosition");
		// System.out.println("获得外系统用户工作职位:"+jobPosition);
		return jobPosition;
	}

	/**
	 * 家庭电话
	 */
	@Override
	public String getHomeTelNumber() {
		String homeTelNumber = homeInfoMap.get("homeTelNumber");
		// System.out.println("获得外系统用户家庭电话:"+homeTelNumber);
		return homeTelNumber;
	}

	/**
	 * 家庭地址
	 */
	@Override
	public String getHomeAddress() {
		String homeAddress = homeInfoMap.get("homeAddress");
		// System.out.println("获得外系统用户家庭地址:"+homeAddress);
		return homeAddress;
	}
	
}

程序调用类:App.java

package com.ice.adapter;
/**
 * 具体的应用、在这里可以看成是A公司系统调用B公司的系统的调用程序
 * @author [email protected]
 *
 */
public class App {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		OuterUserInfo outerUserInfo = new OuterUserInfo();
		System.out.println("A公司用户系统开始调用B公司用户系统用户信息.....\n");
		System.out.println("获得外系统用户姓名:"+outerUserInfo.getUserName());
		System.out.println("获得外系统用户手机号码:"+outerUserInfo.getMobileNumber());
		System.out.println("获得外系统用户办公号码:"+outerUserInfo.getOfficeTelNumber());
		System.out.println("获得外系统用户工作职位:"+outerUserInfo.getJobPosition());
		System.out.println("获得外系统用户家庭电话:"+outerUserInfo.getHomeTelNumber());
		System.out.println("获得外系统用户家庭地址:"+outerUserInfo.getHomeAddress());
		System.out.println("\nA公司用户系统已成功调用B公司用户系统.....");

	}

}

程序运行结果:

JAVA设计模式之 适配器模式【Adapter Pattern】_第5张图片



这就是适配器模式、每一种设计模式都是一种经典的编程思想!我是小吕 <ice>


你可能感兴趣的:(java设计模式,适配器模式)