适配器模式
适配器模式
-
适配器模式的定义是,Convert the interface of a class into another interface clients expect,将某个类的接口转换为接口客户所需的类型。换句话说,适配器模式解决的问题是,使得原本由于接口不兼容而不能一起工作、不能统一管理的那些类可以在一起工作、可以进行统一管理。
-
这里举个适配器模式的例子:这里有厨师接口 ICooker、程序员接口 IProgrammer,分别用于定义他们各自工种的具体工作。然后又定义了全聚德的厨师 QjdCooker、京东的程序员JdProgrammer。这些不同的工种所做的工作都各自是不同的,无法进行统一管理,协同工作。所以,此时就需要定义一个员工适配器接口 IWorkerAdapter,用于将这些不同的工种进行统一管理。
interface ICooker{ //定义ICooker String cook(); } interface IProgrammer{ //定义IProgrammer String program(); } class QjdCooker implements ICooker{ @Override public String cook() { return "美味烤鸭"; } } class JdProgrammer implements IProgrammer{ @Override public String program() { return "高效程序"; } }
-
不使用适配器模式
若不使用适配器模式,则调用者需要定义出所有的工种对象,然后逐个工种对象的工作方法进行调用。有 30 个工种,就应调用 30 个工作方法。很麻烦。
class MyTest{ public static void main(String[] args) { ICooker cooker=new QjdCooker(); IProgrammer programmer=new JdProgrammer(); System.out.println(cooker.cook()); System.out.println(programmer.program()); } }
-
只定义一个适配器实现类
这种方式类似于多功能充电器,一个电源插头上接着多种类型的充电接口。用户在使用时需要使用电器接口与多功能充电器上的充电接口逐个进行对比,接口匹配,则可以充电。
定义IWorkerAdapter
interface IWorkAdapter{ //为了兼容所有的工种,这里的参数必须为Object void work(Object worker); }
定义 WorkerAdapter
class WorkAdapter implements IWorkAdapter{ @Override public void work(Object worker) { if(worker instanceof IProgrammer){ System.out.println(((IProgrammer)worker).program()); } if(worker instanceof ICooker){ System.out.println(((ICooker)worker).cook()); } } }
定义测试类
class MyTest2{ public static void main(String[] args) { ICooker cooker=new QjdCooker(); IProgrammer programmer=new JdProgrammer(); Object[] workers={cooker,programmer}; IWorkAdapter adapter=new WorkAdapter(); for(Object worker:workers){ adapter.work(worker); } } }
-
为每一个工种都定义一个适配器
修改 IWorkerAdapter
interface IWorkAdapter{ //为了兼容所有的工种,这里的参数必须为Object void work(Object worker); //判断当前适配器是否支持指定的工种对象 boolean supports (Object worker); }
定义 CookerAdatper、ProgrammerAdapter
class CookerAdapter implements IWorkAdapter{ @Override public void work(Object worker) { System.out.println(((ICooker)worker).cook()); } @Override public boolean supports(Object worker) { // TODO Auto-generated method stub return (worker instanceof ICooker); } } class ProgrammerAdapter implements IWorkAdapter{ @Override public void work(Object worker) { System.out.println(((IProgrammer)worker).program()); } @Override public boolean supports(Object worker) { // TODO Auto-generated method stub return (worker instanceof IProgrammer); } }
定义测试类
相关阅读
看springmvc适配器模式---HandlerAdapter
适配器模式 就是你有一个类接口,但是这个接口不太符合你的预期,如果要用他就需要在他的源码上进行一些修改,这时你可以做一个适配器
在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需