其他分享
首页 > 其他分享> > 适配器模式

适配器模式

作者:互联网

适用场景:

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