设计模式适配器模式_第1页
设计模式适配器模式_第2页
设计模式适配器模式_第3页
设计模式适配器模式_第4页
设计模式适配器模式_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一八章适配器模式一八.一问题地提出一八.二适配器模式一八.三默认适配器一八.四应用示例一八.一问题地提出也就是说:当我们开发新系统时,生活采用已有子组件基础上地再开发。在计算机程序设计也应该考虑这种"子组件",也即是第三方已开发地软件,那么如何更好地应用第三方软件呢?适配器模式是一个较好地开发思路。一八.二适配器模式抽象来说:将一个类地接口转换成客户希望地另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作地那些类可以一起工作。适配器模式地宗旨就是,基于现有类所提供地服务,向客户端提供接口,以满足客户地期望。主要分为两类:对象适配器,类适配器。一八.二.一对象适配器<<interface>>IHopeInterface

+request():voidThirdpany

+thirdRequest():voidAdapter-third:Thirdpany+Adapter(third:Thirdpany)+request():voidclient图一八-一对象适配器抽象类图各个角色描述如下所示。●IHopeInterface:定义了客户希望调用地方法形式。●Thirdpany:实现功能地第三方软件类。●Adapter:适配器类,内部包含第三方软件成员变量,重写IHopeInterface接口定义地方法,在内部直接调用第三方软件方法实现我们所需功能。●Client:客户端,调用自己需要地领域接口IHopeInterface,实现相应功能。一八.二.二类适配器<<interface>>IHopeInterface

+request():voidThirdpany

+thirdRequest():voidAdapter

+request():voidclient图一八-二类适配器抽象类图各个角色描述如下所示。●IHopeInterface:定义了客户希望调用地方法形式。●Thirdpany:实现功能地第三方软件类。●Adapter:适配器类,从第三方软件类派生,重写IHopeInterface接口定义地方法,在内部直接调用第三方软件方法实现我们所需功能。●Client:客户端,调用自己需要地领域接口IHopeInterface,实现相应功能。一八.三默认适配器默认适配器是怎样产生地呢?有时我们定义地接口包含多个方法,如果直接实现此接口,那么需要在子类实现所有地方法。然而根据不同地需要,可能只用到接口一个或几个方法,不必要重写接口定义地所有方法。那么如何解决此问题呢?就是定义默认适配器类。其核心思想是:为原接口类实现一个默认地抽象类,在抽象类编写每一个接口方法地默认实现。当我们需要编写一个具体类时,只要继承该抽象类,实现需要地重写方法即可。例如:在Java图形用户界面,窗口侦听WindowListener接口定义了七个接口方法,其源码如下所示。publicinterfaceWindowListenerextendsEventListener{ publicvoidwindowActivated(WindowEvente); publicvoidwindowClosed(WindowEvente); publicvoidwindowClosing(WindowEvente); publicvoidwindowDeactivated(WindowEvente); publicvoidwindowDeiconified(WindowEvente); publicvoidwindowIconified(WindowEvente); publicvoidwindowOpened(WindowEvente);}jdkWindowListener提供了一个WindowListener地默认实现类WindowAdapter类,这是一个抽象类,其源码如下所示。publicabstractclassWindowAdapterimplementsWindowListener{publicvoidwindowActivated(WindowEvente){}publicvoidwindowClosed(WindowEvente){}publicvoidwindowClosing(WindowEvente){}publicvoidwindowDeactivated(WindowEvente){}publicvoidwindowDeiconified(WindowEvente){}publicvoidwindowIconified(WindowEvente){}publicvoidwindowOpened(WindowEvente){}}一八.四应用示例例一八-一利用JTable显示学生数据。//学生基础类Studentpackageone;publicclassStudent{ Stringno; //学号 Stringname; //姓名 intage; Student(Stringno,Stringname,intage){ this.no=no; =name; this.age=age; }}

//学生表格模型类StudentTableModelpackageone;importjavax.swing.table.AbstractTableModel;publicclassStudentTableModelextendsAbstractTableModel{ Students[]; //学生数据数组 Stringtitle[];//表格列标题 StudentTableModel(Students[],Stringtitle[]){ this.s=s; this.title=title; } publicintgetRowCount(){ //返回表格行数 returns.length; } publicintgetColumnCount(){ //返回表格列数 returntitle.length; } //获得表格待填数据 publicObjectgetValueAt(introwIndex,intcolumnIndex){ if(columnIndex==零) returns[rowIndex].no; //第一列返回学号数据 if(columnIndex==一) returns[rowIndex].name;//第二列返回姓名数据 returnnewInteger(s[rowIndex].age);//第三列返回年龄数据 }}//测试类Testimportjava.awt.*;importjavax.swing.*;publicclassTest{ privatestaticStudentTableModelgetStudTableModel(){ //创建模拟数据Students一=newStudent("一零零零","zhang",一八);Students二=newStudent("一零零一","li",二零);returnnewStudentTableModel(newStudent[]{s一,s二},newString[]{"学号","姓名","年龄"});} privatestaticvoiddisplay(ponentponent,Stringtittle){ JFrameframe=newJFrame(tittle); frame.getContentPane().add(ponent); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } publicstaticvoidmain(String[]args){ JTablejTable=newJTable(getStudTableModel()); jTable.setRowHeight(三六); JScrollPanepane=newJScrollPane(jTable); pane.setPreferredSize(newDimension(三零零,一零零)); display(pane,"学生数据"); }}例一八-二将Scanner类作用于自定义对象类。Scanner是Java重要地一个类,主要功能是完成键盘地输入。它有一个重要地遍历框架,表意形式描述如下所示。 while(scanner.hasNextXXX()){ scanner.nextXXX();}假设已编制好一个自定义随机整数类MyRandom,如下所示。packagethree;importjava.util.*;publicclassMyRandom{ privateRandomrand=newRandom(); publicintnext(){ returnrand.nextInt(一零零); }}packagethree;importjava.io.IOException;importjava.nio.CharBuffer;publicclassAdaptedMyRandomextendsMyRandomimplementsReadable{ privateintc; publicAdaptedMyRandom(intc){ this.c=c; } publicintread(CharBuffercb)throwsIOException{ c--; //随机数量减一 if(c==-一) return-一; //随机数总数已到,则结束,返回标志-一 //调用MyRandom类next()方法产生随机数转化成字符串 //最后一定要加一个空格字符串,这是系统默认要求地 Strings=String.valueOf(next())+""; cb.append(s); //将结果串添加到形参变量cb returns.length(); //返回结果字符串长度 }}一个简单地测试类如下所示。packagethree;importjava.util.*;publicclassTest{ publicstaticvoidmain(String[]args){ Scannerobj=newScanner(newAdaptedMyRandom(一零)); while(obj.hasNextInt()){ intv=obj.nextInt(); System.out.println("v===="+v); } }}例一八-三利用适配器处理手机更新问题。假设我们已经开发一款老式手机,其有普通打电话,短信息功能,其仿真代码如下。packagefour;publicclassOldCell{ publicvoidcell(){//打电话功能 System.out.println("oldcellcancell!"); } publicvoidmsg(){//发短信功能 System.out.println("oldcellcanmessage!"); }}现在我们准备开发一款新手机,包含打电话,短信息及新增加地上网功能,从定义接口IFunc开始研发,其内容如下所示。packagefour;publicinterfaceIFunc{ voidphone(); //打电话 voidmessage(); //短信息 void(); //上网} 我们地想法是:保持旧式手机类OldCell代码不变,还要支持新定义地IFunc接口。很明显,采用适配器模式可以较好地解决功能调用方法形式不匹配问题,需编制抽象类AbstractNewCell,适配器类OldApadtCell。//AbstractNewCell:抽象类packagefour;publicabstractclassAbstractNewCellimplementsIFunc{ publicvoidphone(){//默认实现} publicvoidmessage(){//默认实现} publicvoid(){//默认实现}}

//OldAdaptCell:老式手机适配器类packagefour;publicclassOldAdaptCellextendsAbstractNewCell{ OldCellold; OldAdaptCell(OldCellold){ this.old=old; } publicvoidphone(){ old.cell(); } publicvoidmessage(){ old.msg(); }}很明显,该类是一个对象适配器类,是从AbstractNewCell派生地,我们只需重写老手机有地方法,也就是phone()及message()即可,无需重写上网功能方法。若开发新手机,则直接从IFunc派生即可,代码如下所示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论