当前位置: 首页 > 后端技术 > Java

设计模式【6.2】--再来说说适配器模式

时间:2023-04-01 15:32:49 Java

这里说的适配器不是通常说的类适配器、对象适配器、接口适配器,这里实现的是统一管理所有类的适配器。如果需要查找设计模式的三种主要适配器模式,请点击https://blog.csdn.net/Aphysia...适配器模式(百度百科):在计算机编程中,适配器模式(有时也称为包装风格或包装器)使类的接口适应用户的期望。适配器通过将类自己的接口包装在现有类中,允许通常由于不兼容接口而不能一起工作的类一起工作。可以理解为两个接口或两个类可能不兼容。适配器模式要做的就是统一管理它们,让它们协同工作。举个简单的例子:内存卡和笔记本是不能直接连接工作的,我们是用读卡器,相当于适配器来连接的。1、不使用适配器的例子:??需求:程序员的工作是program(),老师的工作是teach()。那么这些不同的职业有不同的具体工作。这些程序员的program()方法的内容也可能不一样,比如京东、阿里、腾讯等,老师都是一样的,不同学校老师的工作内容也是不一样的。所以我们必须定义接口,不同的工作内容也可以通过实现自己的接口来实现。代码结果如下:publicinterfaceIProgramer{publicvoidprogram();}Programer.class(程序员的类,实现了代码的接口)packagecom.noadapter;publicclassProgramerimplementsIProgramer{@Overridepublicvoidprogram(){System.out.println("我是一个优秀的程序员,我整天都在写代码");}}下面的teacher接口和实现teacher的类也和上面的程序员一样:ITeacher.class(teacher教学接口):packagecom.noadapter;publicinterfaceITeacher{publicvoidteach();}Teacher.class(实现教学的教师类):packagecom.noadapter;publicclassTeacherimplementsITeacher{@Overridepublicvoidteach(){System.out.println("我是老师,我教祖国的花朵");}}MyTest.class测试类:packagecom.noadapter;publicclassMyTest{publicstaticvoidmain(String[]args){ITeacherteacher=newTeacher();IProgramer程序员=newProgramer();//必须一一访问他们的方法teacher.teach();程序员.program();}}运行结果:理解:如果不是被adapters模糊了,那我们就要定义所有类型的job对象(程序员,老师等),并为他们实现各自的接口,然后调用他们的方法,就是工种有多少,方法调用就得写多少,麻烦2.只定义一个适配器实现类。在之前的基础上修改,增加IWorkAdapter.class及其实现类WorkerAdapter.class,并更改测试方法。其他不变。代码结构如下:新增IWorkAdapter.class(Adapter接口):publicinterfaceIWorkAdapter{//参数之所以为Object是因为兼容所有类型的工作对象publicvoidwork(Objectworker);}新增WorkAdapter.class(适配器类):publicclassWorkAdaperimplementsIWorkAdapter{@Overridepublicvoidwork(Objectworker){if(workerinstanceofIProgramer){((IProgramer)worker).program();}if(workerinstanceofITeacher){((ITeacher)worker).teach();}}}更改测试类MyTest.class:publicclassMyTest{publicstaticvoidmain(String[]args){ITeacherteacher=newTeacher();IProgramer程序员=newProgramer();//将两种工种放入Object数组中Object[]workers={teacher,programer};//定义一个适配器IWorkAdapteradapter=newWorkAdaper();//适配器遍历对象for(Objectworker:workers){adapter.work(worker);}}}结果还是一样:分析:只写一个一个适配器,功能上就像是把接口集合在一起,中间加了一层,这一层屏蔽了调用不同工种(程序员,老师)的差异,从而达到解耦的效果3.多适配器模式就是为每一种工作类型定义一个适配器(在一个适配器的基础上进行修改)修改IWorkAdapter.classpublicinterfaceIWorkAdapter{//参数之所以为Object是因为兼容所有类型工作对象publicvoidwork(Objectworker);//判断当前适配器是否支持指定类型的工作对象booleansupports(Objectworker);}定义一个TeacherAdapter.classpublicclassTeacherAdapterimplementsIWorkAdapter{@Overridepublicvoidwork(Objectworker){((ITeacher)worker).教();}@Overridepublicbooleansupports(Objectworker){return(workerinstanceofITeacher);}}定义一个ProgrammerAdapter.classpublicclassProgrammerAdapterimplementsIWorkAdapter{@Overridepublicvoidwork(Objectworker){((IProgramer)worker).program();}@Overridepublicbooleansupports(Objectworker){return(workerinstanceofIProgramer);}}测试类(Test.class):publicclassMyTest{publicstaticvoidmain(String[]args){ITeacherteacher=newTeacher();IProgramer程序员=newProgramer();//将两种工种放入对象数组Object[]workers={teacher,programer};//适配器遍历对象for(Objectworker:workers){IWorkAdapteradapter=getAdapter(worker);适配器.工作(工人);}}publicstaticIWorkAdaptergetAdapter(Objectobject){IWorkAdapterteacherAdapter=newTeacherAdapter();IWorkAdapterprogrammerAdapter=newProgrammerAdapter();IWorkAdapter[]适配器={teacherAdapter,programmerAdapter};for(IWorkAdapteradapter:adapters){支持if(ports(.object)){返回适配器;}}返回空值;}}个人理解:其实多适配器的根源就是获取支持对象的适配器,通过适配器使用对象