一:适配器模式例子
附上源码:
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类图对比
三:总结:
适配器模式是一种“补救”模式,不是为了解决处于开发阶段的问题,而是解决正在服役的项目问题。