




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
适配器:基于现有类所提供的服务,向客户提供接口,以满足客户的期望 Java设计模式 类适配器 客户的开发人员定义了一个接口,期望用这个接口来完成整数的求和操作,接口定义如下: Java代码 1. publicinterfaceOperation 2. publicintadd(inta,intb); 3. public interface Operation public int add(int a,int b);开发人员在了解这个接口的定义后,发现一个第三方类,里面有一个方法能实现他们期望的功能,其代码如下: Java代码 1. publicclassOtherOperation 2. publicintotherAdd(inta,intb) 3. returna+b; 4. 5. public class OtherOperation public int otherAdd(int a,int b) return a + b; 以上第三方类OtherOperation的方法public int otherAdd(int a,int b)所提供的功能,完全能符合客户的期望,所以只需要想办法把OtherOperation的otherAdd(int a,int b)和客户的Operation接口联系起来,让这个第三方类来为客户提供他们期望的服务就行了,这样就避免了开发人员再度去研究类似OtherOperation的otherAdd(int a,int b)方法的实现(利用已有的轮子,避免重复发明),这方法之一,就是用适配器模式: Java代码 1. publicclassAdapterOperationextendsOtherOperationimplementsOperation 2. publicintadd(inta,intb) 3. returnotherAdd(a,b); 4. 5. public class AdapterOperation extends OtherOperation implements Operation public int add(int a,int b) return otherAdd(a,b); 以上就是适配器的实现方法之一,类适配器,在以上实现中存在着三中角色分别是: 1:适配目标角色:Operation。 2:适配类(原)角色:OtherOperation。 3:适配器角色:AdapterOperation。 其中适配器角色是适配器模式的核心。 适配器的主要工作就是通过封装现有的功能,使他满足需要的接口。 对象适配器 我们再来看看另一种情况: 假如客户接口期望的功能不止一个,而是多个: Java代码 1. publicinterfaceOperation 2. publicintadd(inta,intb); 3. publicintminus(inta,intb); 4. publicintmultiplied(inta,intb); 5. public interface Operation public int add(int a,int b); public int minus(int a,int b); public int multiplied(int a,int b);而能提供这些实现的原可能不止一个: Java代码 1. publicclassOtherAdd 2. publicintotherAdd(inta,intb) 3. returna+b; 4. 5. 6. 7. publicclassOtherMinus 8. publicintminus(inta,intb) 9. returna-b; 10. 11. 12. 13. publicclassOtherMultiplied 14. publicintmultiplied(inta,intb) 15. returna*b; 16. 17. public class OtherAdd public int otherAdd(int a,int b) return a + b; public class OtherMinus public int minus(int a,int b) return a - b; public class OtherMultiplied public int multiplied(int a,int b) return a * b; 由于java是不能实现多继承的,所以我们不能通过构建一个适配器,让他来继承所有原以完成我们的期望,这时候怎么办呢?只能用适配器的另一种实现-对象适配器: Java代码 1. publicclassAdapterOperationimplementsOperation 2. privateOtherAddadd; 3. privateOtherMinusminus; 4. privateOtherMultipliedmultiplied; 5. 6. publicvoidsetAdd(OtherAddadd) 7. this.add=add; 8. 9. 10. publicvoidsetMinus(OtherMinusminus) 11. this.minus=minus; 12. 13. 14. publicvoidsetMultiplied(OtherMultipliedmultiplied) 15. this.multiplied=multiplied; 16. 17. 18. /适配加法运算 19. publicintadd(inta,intb) 20. returnadd.otherAdd(a,b); 21. 22. 23. /适配减法运算 24. publicintminus(inta,intb) 25. returnminus.minus(a,b); 26. 27. 28. /适配乘法运算 29. publicintmultiplied(inta,intb) 30. returnmultiplied.multiplied(a,b); 31. 32. public class AdapterOperation implements Operation private OtherAdd add; private OtherMinus minus; private OtherMultiplied multiplied; public void setAdd(OtherAdd add) this.add = add; public void setMinus(OtherMinus minus) this.minus = minus; public void setMultiplied(OtherMultiplied multiplied) this.multiplied = multiplied; /适配加法运算 public int add(int a,int b) return add.otherAdd(a,b); /适配减法运算 public int minus(int a,int b) return minus.minus(a,b); /适配乘法运算 public int multiplied(int a,int b) return multiplied.multiplied(a,b); 上面代码很明显,适配器并不是通过继承来获取适配类(原)的功能的,而是通过适配类的对象来获取的,这就解决了java不能多继承所带来的不便了。这也是java提倡的编程思想之一,即尽量使用聚合不要使用继承。 还有一种情况是需要使用对象适配器的。我们来看看, 单我们的客户提供的需求并不是一个明确的接口,而是一个类,并没有定义期望的方法,如下 Java代码 1. publicclassA 2. publicintadd(inta,intb) 3. returna+b; 4. 5. public class A public int add(int a,int b) return a + b; 现在客户要一个新类B,要求能在保留类A功能的情况下增加一个运算减法的功能,并要求B能随时替换掉A但不能对已有系统造成影响。这样我们只能新建一个类B,并让B继承A。 Java代码 1. publicclassBextendsA 2. b() 3. super(); 4. 5. 6. publicintminus(inta,intb) 7. /待实现的减法运算函数. 8. 9. public class B extends A b() super(); public int minus(int a,int b) /待实现的减法运算函数. 这时候,我们发现类C已经提供了实现减法的函数, Java代码 1. publicclassC 2. publicintminus(inta,intb) 3. returna-b; 4. 5. public class C public int minus(int a,int b) return a - b; 为了避免重复去设计该函数,我们决定引入C类,通过适配C类来达到我们的期望,但问题是A和C都是一个具体类,我们无法让B同时继承这个两个类,而B继承A又是必须的,所以我们只能考虑把C给内聚到B内部,对象适配器又得派上用场了。 Java代码 1. publicclassBextendsA 2. 3. privateCc; 4. 5. B() 6. super(); 7. 8. 9. publicvoidsetMinus(Cc) 10. this.c=c; 11. 12. 13. publicintminus(inta,intb) 14. returnc.minus(a,b); 15. 16. public class B extends A private C c; B() super(); public void setMinus(C c) this.c= c; public int minus(int a,int b) return c.minus(a,b); 这样,在需要A类的地方都能用B类来代替,同时又保证了新的功能的引入。 更灵活的实现-隐藏目标接口的抽象适配器 做java 桌面应用的都知道WindowListener接口, Java代码 1. publicinterfaceWindowListenerextendsEventListener 2. publicvoidwindowActivated(WindowEvente); 3. publicvoidwindowClosed(WindowEvente); 4. publicvoidwindowClosing(WindowEvente); 5. publicvoidwindowDeactivated(WindowEvente); 6. publicvoidwindowDeiconified(WindowEvente); 7. publicvoidwindowIconified(WindowEvente); 8. publicvoidwindowOpened(WindowEvente); 9. public interface WindowListener extends EventListener public void windowActivated(WindowEvent e); public void windowClosed(WindowEvent e); public void windowClosing(WindowEvent e); public void windowDeactivated(WindowEvent e); public void windowDeiconified(WindowEvent e); public void windowIconified(WindowEvent e); public void windowOpened(WindowEvent e);要实现这个接口,我们就必须实现它所定义的所有方法,但是实际上,我们很少需要同时用到所有的方法,我们要的只是其中的两三个。为了不使我们实现多余的方法, jdk WindowListener提供了一个WindowListener的默认实现类WindowAdapter类,这是一个抽象类, Java代码 1. publicabstractclassWindowAdapterimplementsWindowListener 2. publicvoidwindowActivated(WindowEvente) 3. publicvoidwindowClosed(WindowEvente) 4. publicvoidwindowClosing(WindowEvente) 5. publicvoidwindowDeactivated(WindowEvente) 6. publicvoidwi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海市2025上海复旦大学微电子学院闫娜教授课题组博士后招收笔试历年参考题库附带答案详解
- 2025贵州水电九局四公司招聘1人笔试参考题库附带答案详解
- 2025河南驻马店全域矿业开发公司招聘27人笔试参考题库附带答案详解
- 2025江西吉安市井冈山品牌运营有限公司招聘3人笔试参考题库附带答案详解
- 2025年陕西牛背梁景区招聘(22人)笔试参考题库附带答案详解
- 2025年福建省宁德市高速技术人员(外包岗位)招聘75名笔试参考题库附带答案详解
- 2025年度广西壮族自治区粮油质量检验中心公开招聘工作人员1人笔试参考题库附带答案详解
- 2025年临安区区属国有企业公开招聘工作人员笔试参考题库附带答案详解
- 2025四川绵阳燃气集团有限公司招聘集团及下属子公司25个岗位25人笔试参考题库附带答案详解
- 2025内蒙古金土华维可控农业科技有限公司招聘9名工作人员笔试参考题库附带答案详解
- 2023年安康市交通建设投资集团有限公司招聘笔试模拟试题及答案解析
- Be-Safe-on-the-Way课件(省一等奖)
- 大学生心理健康优秀说课-比赛课件
- 高中英语词汇3500词(含音标)
- 凝结水泵解体检修课件
- TDTG提升机说明书
- 度基本公卫工作整改台账
- 大宗商品贸易业务风险管理指引
- 公务员第二批
- 阳宅风水培训讲义课件
- 1《材料科学基础》第一章晶体学基础课件
评论
0/150
提交评论