2014/7/19 适配器模式

一:适配器模式例子

附上源码:

IUserInfo.java

package adapterPattern;

public interface IUserInfo 
{
	public String getUserName();
	public String getHomeAddress();
    public String getMobileNumber();
    public String getOfficeTelNumber();
    public String getJobPosition();
    public String getHomeTelNumber();
}

UserInfo.java

package adapterPattern;

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("职位是");
		return null;
	}

	public String getMobileNumber() {
		System.out.println("手机号码是");
		return null;
	}

	public String getOfficeTelNumber() {
		System.out.println("办公室电话是");
		return null;
	}

	public String getUserName() {
		System.out.println("姓名是");
		return null;
	}
	
}

IOuterUser.java

package adapterPattern;

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("职位是");
		return null;
	}

	public String getMobileNumber() {
		System.out.println("手机号码是");
		return null;
	}

	public String getOfficeTelNumber() {
		System.out.println("办公室电话是");
		return null;
	}

	public String getUserName() {
		System.out.println("姓名是");
		return null;
	}
	
}

OuterUser.java

package adapterPattern;

import java.util.HashMap;
import java.util.Map;

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("homeTelNumber", "员工的家庭电话是...");
		homeInfo.put("homeAddress", "员工的家庭地址是...");
		return homeInfo;
	}

	public Map getUserOfficeInfo() {
		HashMap officeInfo = new HashMap();
		officeInfo.put("jobPosition", "这个人的职位是...");
		officeInfo.put("officeTelNumber", "员工的办公电话是...");
		return officeInfo;
	}

}

OuterUserInfo.java

package adapterPattern;

import java.util.Map;

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

}

Client.java

package adapterPattern;

public class Client
{
	public static void main(String[] args)
	{
		IUserInfo youngGirl = new OuterUserInfo();
		for(int i=0;i<101;i++)
			youngGirl.getMobileNumber();
	}
}

二:适配器模式的扩展:

如果其他公司提供的接口有多个,就不能让OuterUserInfo类继承多个实现类,因为Java不支持多继承。

解决方法:通过关联的方式与三个实现类进行通讯

附上源码:

IUserInfo.java与UserInfo.java参见上面代码

IOuterUserBaseInfo.java

package adapterPattern2;

import java.util.Map;

public interface IOuterUserBaseInfo 
{
	public Map getUserBaseInfo();
}

IOuterUserHomeInfo.java

package adapterPattern2;

import java.util.Map;

public interface IOuterUserHomeInfo
{
	public Map getUserHomeInfo();
}

IOuterUserOfficeInfo.java

package adapterPattern2;

import java.util.Map;

public interface IOuterUserOfficeInfo 
{
	public Map getUserOfficeInfo();
}

OuterUserBaseInfo.java

package adapterPattern2;

import java.util.HashMap;
import java.util.Map;

public class OuterUserBaseInfo implements IOuterUserBaseInfo {

	public Map getUserBaseInfo() {
		HashMap baseInfoMap = new HashMap();
		baseInfoMap.put("userName", "这个员工叫...");
		baseInfoMap.put("mobileNumber", "这个员工电话是...");
		return baseInfoMap;
	}
}

OuterUserHomeInfo.java

package adapterPattern2;

import java.util.HashMap;
import java.util.Map;

public class OuterUserHomeInfo implements IOuterUserHomeInfo {

	public Map getUserHomeInfo() {
		HashMap homeInfo = new HashMap();
		homeInfo.put("homeTelNumber", "员工的家庭电话是...");
		homeInfo.put("homeAddress","员工的家庭地址是...");
		return homeInfo;
	}
}

OuterUserOfficeInfo.java

package adapterPattern2;

import java.util.HashMap;
import java.util.Map;

public class OuterUserOfficeInfo implements IOuterUserOfficeInfo {

	public Map getUserOfficeInfo() {
		HashMap officeInfo = new HashMap();
		officeInfo.put("jobPosition", "这个人的职位是...");
		officeInfo.put("officeTelNumber", "员工的办公电话是...");
		return officeInfo;
	}
}

OuterUserInfo.java

package adapterPattern2;

import java.util.Map;

import adapterPattern.IUserInfo;

//适配器
public class OuterUserInfo implements IUserInfo
{
	//源目标对象
	private IOuterUserBaseInfo baseInfo = null;
	private IOuterUserHomeInfo homeInfo = null;
	private IOuterUserOfficeInfo officeInfo = null;
	//数据处理
	private Map baseMap = null;
	private Map homeMap = null;
	private Map officeMap = null;
	
	//构造函数传递对象
	public OuterUserInfo(IOuterUserBaseInfo _baseInfo,IOuterUserHomeInfo _homeInfo,IOuterUserOfficeInfo _officeInfo)
	{
		this.baseInfo = _baseInfo;
		this.homeInfo = _homeInfo;
		this.officeInfo = _officeInfo;
		//数据处理
		this.baseMap = this.baseInfo.getUserBaseInfo();
		this.homeMap = this.homeInfo.getUserHomeInfo();
		this.officeMap = this.officeInfo.getUserOfficeInfo();
	}

	public String getHomeAddress() {
		String homeAddress = (String) this.homeMap.get("homeAddress");
		System.out.println(homeAddress);
		return homeAddress;
	}

	public String getHomeTelNumber() {
		String homeTelNumber = (String)this.homeMap.get("homeTelNumber");
		System.out.println(homeTelNumber);
		return homeTelNumber;
	}

	public String getJobPosition() {
		String jobPosition = (String)this.officeMap.get("jobPosition");
		System.out.println(jobPosition);
		return jobPosition;
	}

	public String getMobileNumber() {
		String mobileNumber = (String) this.baseMap.get("mobileNumber");
		System.out.println(mobileNumber);
		return mobileNumber;
	}

	public String getOfficeTelNumber() {
		String officeTelNumber = (String)this.officeMap.get("officeTelNumber");
		System.out.println(officeTelNumber);
		return officeTelNumber;
	}

	public String getUserName() {
		String userName = (String)this.baseMap.get("userName");
		System.out.println(userName);
		return userName;
	}
}

Client.java

package adapterPattern2;

import adapterPattern.IUserInfo;

public class Client 
{
	public static void main(String[] args)
	{
		IOuterUserBaseInfo baseInfo = new OuterUserBaseInfo();
		IOuterUserHomeInfo homeInfo = new OuterUserHomeInfo();
		IOuterUserOfficeInfo officeInfo = new OuterUserOfficeInfo();
		//传递三个对象
		IUserInfo youngGirl = new OuterUserInfo(baseInfo,homeInfo,officeInfo);
		for(int i=0;i<101;i++)
			youngGirl.getMobileNumber();
	}
}

注意:该例中的适配器为对象适配器,第一个例子的适配器是类适配器

类适配器与对象适配器的区别:

类适配器是类间继承,对象适配器是类的关联关系。参考书p219,225类图对比

三:总结:

适配器模式是一种“补救”模式,不是为了解决处于开发阶段的问题,而是解决正在服役的项目问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值