适配器模式
学习自 《设计模式之禅(第二版)》
定义
Convert the interface of a class into another interface clients expect.Adapter lets classes worktogether that couldn’t otherwise because of incompatible interfaces.
一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式又叫做变压器模式,也叫做包装模式(Wrapper),但是包装模式可不止一个,还包括了装饰模式。
- Target目标角色
该角色定义把其他类转换为何种接口,也就是我们的期望接口,例子中的IUserInfo接口就是目标角色。 - Adaptee源角色
你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新、靓丽的角色。 - Adapter适配器角色
适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:把源角色转换为目标角色,怎么转换?通过继承或是类关联的方式。
优点
- 适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就成。
- 增加了类的透明性
- 提高了类的复用度
- 灵活性非常好
适配器模式最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式,这个模式使用的主要场景是扩展应用中,就像我们的那个例子一样,系统扩展了,不符合原有设计的时候才考虑通过适配器模式减少代码修改带来的风险
代码实现
/**
* @author huangqh
* @create 2020/12/18 16:36
* @Notes 适配器模式
*/
public class Adapter {
}
/**
* 甲方接口
*/
interface IUserInfo {
public String getUserName();
public String getHomeAddress();
public String getMobileNumber();
public String getOfficeTelNumber();
public String getJobPosition();
public String getHomeTelNumber();
}
/**
* 甲方实现类
*/
class UserInfo implements IUserInfo {
@Override
public String getUserName() {
System.out.println("姓名叫做...");
return null;
}
@Override
public String getHomeAddress() {
System.out.println("这里是员工的家庭地址...");
return null;
}
@Override
public String getMobileNumber() {
System.out.println("这个人的手机号码是0000...");
return null;
}
@Override
public String getOfficeTelNumber() {
System.out.println("办公室电话是...");
return null;
}
@Override
public String getJobPosition() {
System.out.println("这个人的职位是BOSS...");
return null;
}
@Override
public String getHomeTelNumber() {
System.out.println("员工的家庭电话是...");
return null;
}
}
/**
* 乙方接口
*/
interface IOuterUser {
public Map getUserBaseInfo();
public Map getUserOfficeInfo();
public Map getUserHomeInfo();
}
/**
* 乙方实现类
*/
class OuterUser implements IOuterUser {
@Override
public Map getUserBaseInfo() {
HashMap baseInfoMap = new HashMap();
baseInfoMap.put("userName", "这个员工叫混世魔王...");
baseInfoMap.put("mobileNumber", "这个员工电话是...");
return baseInfoMap;
}
@Override
public Map getUserOfficeInfo() {
HashMap officeInfo = new HashMap();
officeInfo.put("jobPosition", "这个人的职位是BOSS...");
officeInfo.put("officeTelNumber", "员工的办公电话是...");
return officeInfo;
}
@Override
public Map getUserHomeInfo() {
HashMap homeInfo = new HashMap();
homeInfo.put("homeTelNumbner", "员工的家庭电话是...");
homeInfo.put("homeAddress", "员工的家庭地址是...");
return homeInfo;
}
}
/**
* 中转角色
*/
class OuterUserInfo extends OuterUser implements IUserInfo {
private Map baseInfo = super.getUserBaseInfo();
private Map homeInfo = super.getUserHomeInfo();
private Map officeInfo = super.getUserOfficeInfo();
@Override
public String getUserName() {
String userName = (String) this.baseInfo.get("userName");
System.out.println(userName);
return userName;
}
@Override
public String getHomeAddress() {
String homeAddress = (String) this.homeInfo.get("homeAddress");
System.out.println(homeAddress);
return homeAddress;
}
@Override
public String getMobileNumber() {
String mobileNumber = (String) this.baseInfo.get("mobileNumber");
System.out.println(mobileNumber);
return mobileNumber;
}
@Override
public String getOfficeTelNumber() {
String officeTelNumber = (String) this.officeInfo.get("officeTelNumber");
System.out.println(officeTelNumber);
return officeTelNumber;
}
@Override
public String getJobPosition() {
String jobPosition = (String) this.officeInfo.get("jobPosition");
System.out.println(jobPosition);
return jobPosition;
}
@Override
public String getHomeTelNumber() {
String homeTelNumber = (String) this.homeInfo.get("homeTelNumber");
System.out.println(homeTelNumber);
return homeTelNumber;
}
}
class Client{
public static void main(String[] args) {
IUserInfo info = new UserInfo();//甲方使用甲方自己的方法
info=new OuterUserInfo(); //甲方对接乙方
info.getUserName();
}
}