java适配器设计模式

适配器设计模式

定义:将某个类的接口转换为客户所需要的类型,解决的问题是,使得原来由于接口不兼容而不能一起工作、不能统一管理的那些类可以在一起工作,可以进行统一管理。

需求:初始的工作是cook(),程序员的工作是program(),司机的工作是drive(),教室的工作是teach(),不同的工种,其具体的额工作内容不同,现在程序要将这些(例如30个不同的工种)不同工种的工作内容全部输出。

解决方案一:逐个访问每一个工种对象的相应工作的方法,无法循环遍历,无法统一管理

解决方案二:使用适配器设计模式,将这些不兼容的具体工作转换为一个统一的工作,实现循环遍历。

方案一:不使用适配器设计模式

定义的工人的接口和实体类 worker包中的代码

publicinterface ICooker {

    public String cook();

 

}

 

publicinterface IProgrammer {

    public String program();

 

}

 

publicclass JdProgrammerimplements IProgrammer{

 

    @Override

    public String program() {

        //TODO Auto-generated method stub

        return"写高效代码";

    }

 

}

 

publicclass QjdCookerimplements ICooker{

 

    @Override

    public String cook() {

        //TODO Auto-generated method stub

        return"烤制美味烤鸭";

    }

 

}

 

测试类:

publicclass Test {

 

    publicstaticvoid main(String[] args) {

        //TODO Auto-generated method stub

        ICooker qjdCooker =new QjdCooker();

        IProgrammer jdProgrammer =new JdProgrammer();

        System.out.println(qjdCooker.cook());

        System.out.println(jdProgrammer.program());

 

    }

}

方案二:使用适配器设计模式

单个适配器demo

 

源代码:

定义的工人的接口和实体类 worker包中的代码

publicinterface ICooker {

    public String cook();

 

}

 

publicinterface IProgrammer {

    public String program();

 

}

 

publicclass JdProgrammerimplements IProgrammer{

 

    @Override

    public String program() {

        //TODO Auto-generated method stub

        return"编写高效代码";

    }

 

}

 

publicclass QjdCookerimplements ICooker{

 

    @Override

    public String cook() {

        //TODO Auto-generated method stub

        return"烤制美味烤鸭";

    }

}

定义适配器的接口和实体类:【adapter包中的代码】

publicinterface IWorkerAdapter {

    String work(Object worker);

 

}

 

publicclass WorkerAdapterimplements IWorkerAdapter {

    String workContent="";

 

    @Override

    public String work(Object worker) {

        //TODO Auto-generated method stub

        //如果传来的对象是厨师

        if(workerinstanceof ICooker){

             workContent = ((ICooker)worker).cook();

        }if(workerinstanceof IProgrammer){

             workContent = ((IProgrammer)worker).program();

        }

        returnworkContent;

    }

 

}

 

测试类

publicclass Test {

 

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) {

        //TODO Auto-generated method stub

        ICooker qjdCooker=new QjdCooker();

        IProgrammer jdProgrammer =new JdProgrammer();

        Object [] workers ={qjdCooker,jdProgrammer};

        IWorkerAdapter adapter =new WorkerAdapter();

        for (Object worker : workers) {

            System.out.println(adapter.work(worker));

            

        }    

 

    }

}

 

 

运行效果

多个适配器demo

定义的工人的接口和实体类 worker包中的代码【worker包中的代码

publicinterface ICooker {

    public String cook();

 

}

 

publicinterface IProgrammer {

    public String program();

 

}

 

publicclass JdProgrammerimplements IProgrammer{

 

    @Override

    public String program() {

        //TODO Auto-generated method stub

        return"编写高效代码";

    }

 

}

 

publicclass QjdCookerimplements ICooker{

 

    @Override

    public String cook() {

        //TODO Auto-generated method stub

        return"烤制美味烤鸭";

    }

 

}

 

定义适配器接口【总的适配器】

publicinterface IWorkerAdapter {

    String work(Object worker);

    //判断传递过来的适配器是否支持

    boolean supports(Object worker);

 

}

 

定义各个适配器

 

publicclass CookerAdapterimplements IWorkerAdapter {

 

    @Override

    public String work(Object worker) {

        //TODO Auto-generated method stub

        return ((ICooker)worker).cook();

    }

 

    @Override

    publicboolean supports(Object worker) {

        //TODO Auto-generated method stub

        return (workerinstanceof ICooker);

    }

 

}

 

publicclass ProgrammerAdapterimplements IWorkerAdapter {

 

    @Override

    public String work(Object worker) {

        //TODO Auto-generated method stub

        return ((IProgrammer)worker).program();

    }

 

    @Override

    publicboolean supports(Object worker) {

        //TODO Auto-generated method stub

        return (workerinstanceof IProgrammer);

    }

 

}

 

测试类:

publicclass Test {

 

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) {

        //TODO Auto-generated method stub

        ICooker qjdCooker =new QjdCooker();

        IProgrammer jdProgrammer =new JdProgrammer();

        Object[] workers = { qjdCooker, jdProgrammer };

 

        for (Object worker : workers) {

            //循环遍历每一个工种,让每一个工种对象在适配器中逐个进行匹配

            IWorkerAdapter adapter =getAdapter(worker);

            System.out.println(adapter.work(worker));

        }

 

    }

 

    //根据worker获取相应的适配器对象

    privatestaticIWorkerAdapter getAdapter(Object worker) {

        //TODO Auto-generated method stub

        //拿到所有适配器

        List<IWorkerAdapter> adapters =getAllAdapters();

        for (IWorkerAdapter adapter : adapters) {

            if (adapter.supports(worker)) {

                return adapter;

            }

        }

 

        returnnull;

    }

 

    //获取所有的适配器

    privatestatic List<IWorkerAdapter> getAllAdapters() {

        //TODO Auto-generated method stub

        List<IWorkerAdapter> adapters =new ArrayList<>();

        adapters.add(new CookerAdapter());

        adapters.add(new ProgrammerAdapter());

        return adapters;

    }

}

缺省适配器模式

定义:是由适配器模式简化而来的,省略了适配器模式中目标接口,也就是源接口和目标接口相同,源接口为接口,目标接口为类

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sonwing_for

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值