2014/7/19 适配器模式

来源:互联网 发布:苏联援助国民党 知乎 编辑:程序博客网 时间:2024/06/15 00:26

一:适配器模式例子

附上源码:

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 0
原创粉丝点击