适配器模式
作者:互联网
适用场景:
1. 类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
2. 对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
3. 接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。
角色
Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
eg:
同济、协和医院的 预约挂号流程里排班、分时方法 返回值类型 不同
1. Adaptee(适配者类):适配者即被适配的角色
同济医院获取排班、分时信息方法的类 AdapteeTongjiHospital
/**
* 源对象类 adaptee
* 同济医院 得到的 排班、分时 方法 需要被适配类
*/
@Service
public class AdapteeTongjiHospital {
/**
* 排班方法
* @return
*/
public List<ScheduleTongji> getScheduleInfo(){
List<ScheduleTongji> list = new ArrayList<ScheduleTongji>();
// 动态医院数据交互 业务处理 得到的 排班 信息 List<ScheduleTongji>
// 此处直接赋值模拟得到 数据
for(int i = 0 ; i < 10 ; i++){
ScheduleTongji scheduleTongji = new ScheduleTongji();
scheduleTongji.setDeptNo("444");
scheduleTongji.setDoctorCode("333");
scheduleTongji.setHospitalId("协和");
scheduleTongji.setScheduleId("scheduleId" + i);
list.add(scheduleTongji);
}
return list;
}
// 分时 方法
}
协和医院获取排班、分时信息方法的 类 AdapteeUnionHospital
/**
* 源对象类 adaptee
* 协和医院 得到的 排班、分时 方法 需要被适配类
*/
@Service
public class AdapteeUnionHospital {
/**
* 排班方法
* @return
*/
public List<ScheduleUnion> getScheduleInfo(){
List<ScheduleUnion> list = new ArrayList<ScheduleUnion>();
// 动态医院数据交互 业务处理 得到的 排班 信息 List<ScheduleTongji>
// 此处直接赋值模拟得到 数据
for(int i = 0 ; i < 10 ; i++){
ScheduleUnion scheduleUnion = new ScheduleUnion();
scheduleUnion.setDeptId("444");
scheduleUnion.setDoctorId("333");
scheduleUnion.setHospitalId("协和");
scheduleUnion.setScheduleId("scheduleId" + i);
list.add(scheduleUnion);
}
return list;
}
// 分时 方法
}
2. Target(目标抽象类) 由于 同济、协和 、A、B ...... 等医院 预约流程大体相同(都有排班、分时、锁号、确认、取消、停诊、替诊)
新建 目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类,此处 是一个接口 TargetHospitalInter
public interface TargetHospitalInter {
/**获取排班接口**/
public Schedule getSchedule();
/**获取分时接口**/
public Parttime getParttime();
}
3. Adapter(适配器类)
将 同济医院 适配者 类 封装成 接口 统一的 样式
/**
* 同济适配器类
* 将同济医院 排班、分时 封装成 统一的接口 形式
*/
public class AdapterTongjiHospiatl implements TargetHospitalInter {
// 注入 AdapteeTongjiHospiatl
@Autowired
private AdapteeTongjiHospital adapteeTongjiHospital;
@Override
public List<Schedule> getSchedule() {
List<Schedule> list = new ArrayList<Schedule>();
List<ScheduleTongji> schedules = adapteeTongjiHospital.getScheduleInfo();
if(!schedules.isEmpty()){
for (ScheduleTongji temp: schedules) {
Schedule schedule = new Schedule();
schedule.setDeptCode(temp.getDoctorCode());
schedule.setDoctorCode(temp.getDoctorCode());
schedule.setHospitalId(temp.getHospitalId());
schedule.setScheduleId(temp.getScheduleId());
list.add(schedule);
}
}else{
//throw new Exception("同济医院适配者类获取排班信息为空");
}
return list;
}
@Override
public List<Parttime> getParttime() {
return null;
}
}
将 协和医院 适配者 类 封装成 接口 统一的 样式
/**
* 同济适配器类
* 将协和医院 排班、分时 封装成 统一的接口 形式
*/
public class AdapterUnionHospiatl implements TargetHospitalInter {
// 注入 AdapteeUnionHospiatl
@Autowired
private AdapteeUnionHospital adapteeUnionHospital;
@Override
public List<Schedule> getSchedule() {
List<Schedule> list = new ArrayList<Schedule>();
List<ScheduleUnion> schedules = adapteeUnionHospital.getScheduleInfo();
if(!schedules.isEmpty()){
for (ScheduleUnion temp: schedules) {
Schedule schedule = new Schedule();
schedule.setDeptCode(temp.getDeptId());
schedule.setDoctorCode(temp.getDoctorId());
schedule.setHospitalId(temp.getHospitalId());
schedule.setScheduleId(temp.getScheduleId());
list.add(schedule);
}
}else{
//throw new Exception("同济医院适配者类获取排班信息为空");
}
return list;
}
@Override
public List<Parttime> getParttime() {
return null;
}
}
4. 客户端
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
TargetHospitalInter adapterTongjiHospiatl = new AdapterTongjiHospiatl();
TargetHospitalInter adapterUnionHospiatl = new AdapterUnionHospiatl();
//将 同济、协和医院 获取排班 的方法 适配成 统一的接口 TargetHospitalInter 接口里的 getSchedule() 方法
List<Schedule> listTj = adapterTongjiHospiatl.getSchedule();
List<Schedule> listUnion = adapterUnionHospiatl.getSchedule();
}
}
标签:适配,适配器,List,接口,模式,排班,public 来源: https://blog.csdn.net/shuzhupeng/article/details/101224584