设计模式之适配器模式
适配器模式又叫变压器模式,也叫做包装模式,但是包装模式可不止一个,如装饰模式,定义如下:Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作)
通用类图
适配器模式的形象比喻图:
三个角色:
1.Target目标角色:该角色定义把其他类转为合欢宗接口,也就是我们期望的接口;
2.Adaptee源角色,你想把谁换成目标角色,谁就是源角色,是已经存在的、运行良好的类或对象,经过适配器角色的包装,会成为一个新的角色;
3.Adapter适配器角色,核心角色,其他两个角色都是已经存在的角色,适配器角色需要新建立,指责非常简单:将源角色转换为目标角色。
通用源码
public interface Target {
public void request();
}
目标角色实现
public class ConcreteTarget implements Target{
public void request(){
System.out.println("if you need any help,pls call me!");
}
}
源角色
public class Adaptee {
public void doSomething(){
System.out.println("I'm kind of busy, leave me alone, pls!");
}
}
适配器角色
public class Adapter extends Adaptee implements Target{
public void request(){
super.doSomething();
}
}
客户端
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Target target=new ConcreteTarget();
target.request();
Target target2=new Adapter();
target2.request();
}
}
适配器模式优点
1.适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定它们就行;
2.增加了类的透明性,我们访问的是Target目标角色,但是具体的实现都委托给了源角色,而这些对于高层次模块是透明的;
3.提高了类的复用度,源角色在原有系统中任然可以使用,在目标角色中也可以充当新的角色;
4.灵活性非常好,不需要适配器时直接将其删掉就行,其他代码基本不用修改。
适配器模式使用场景
你有冬季修改一个已经投产中的接口时,适配器可能就是最适合的模式。比如扩展系统,需要使用一个已有或新建立的类,但这个类又不符合系统的接口。
适配器模式注意事项
适配器模式最好在设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役阶段的问题。适配器模式使用的主要场景是扩展应用中,系统扩展了,不符合原有设计的时候才考虑通过适配器模式减少代码修改带来的风险。
例子:某公司管理向劳务公司借用的员工信息
某公司员工信息接口
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 getUserName(){
System.out.println("姓名");
return null;
}
public String getHomeAddress(){
System.out.println("家庭地址");
return null;
}
public String getMobileNumber(){
System.out.println("移动电话");
return null;
}
public String getOfficeTelNumber(){
System.out.println("办公室电话");
return null;
}
public String getJobPosition(){
System.out.println("工作地址");
return null;
}
public String getHomeTelNumber(){
System.out.println("家庭地址");
return null;
}
}
劳务公司员工信息接口
public interface IOuterUser {
public Map getUserBaseInfo();
public Map getUserOfficeInfo();
public Map getUserHomeInfo();
}
劳务公司员工信息类
public class OuterUser implements IOuterUser{
public Map getUserBaseInfo(){
HashMap baseInfoMap=new HashMap();
baseInfoMap.put("userName","姓名");
baseInfoMap.put("mobileNumber","移动电话");
return baseInfoMap;
}
public Map getUserOfficeInfo(){
HashMap homeInfo=new HashMap();
homeInfo.put("homeTelNumber","家庭电话");
homeInfo.put("homeAddres","家庭地址");
return homeInfo;
}
public Map getUserHomeInfo(){
HashMap officeInfo=new HashMap();
officeInfo.put("jobPosition","工作地址");
officeInfo.put("officeTelNumber","办公室地址");
return officeInfo;
}
}
中转角色
public class OuterUserInfo extends OuterUser implements IUserInfo{
private Map baseInfo=super.getUserBaseInfo();
private Map homeInfo=super.getUserHomeInfo();
private Map officeInfo=super.getUserBaseInfo();
public String getUserName(){
String userName=(String)this.baseInfo.get("userName");
System.out.println(userName);
return userName;
}
public String getHomeAddress(){
String homeAddress=(String)this.baseInfo.get("homeAddress");
System.out.println(homeAddress);
return homeAddress;
}
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 getJobPosition(){
String jobPosition=(String)this.officeInfo.get("jobPosition");
System.out.println(jobPosition);
return jobPosition;
}
public String getHomeTelNumber(){
String homeTelNumber=(String)this.homeInfo.get("homeTelNumber");
System.out.println(homeTelNumber);
return homeTelNumber;
}
}
场景类
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
// IUserInfo youngGirl=new UserInfo();
// for(int i=0;i<101;++i){
// youngGirl.getMobileNumber();
// }
IUserInfo youngGirl=new OuterUserInfo();
for(int i=0;i<101;++i){
youngGirl.getMobileNumber();
}
}
}