经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
java设计模式之浅谈适配器模式
来源:jb51  时间:2021/6/7 9:22:35  对本文有异议

一、结构型模式

结构型模式有什么好处?
从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题

二、适配器模式

USB网线转换器

在这里插入图片描述

三、什么是适配器模式?

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本接口不兼容而不能一起工作的那些类能够变得在一起工作!

四、角色分析

目标接口:客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口
需要适配的类:需要适配的类或适配者类
适配器:通过包装一个需要适配的对象,把原接口转换成目标对象!
例子:

适配的类:网线

  1. package com.jialidun.gof.adapter;
  2.  
  3. //要被适配的类:网线
  4. public class Adaptee {
  5.  
  6. public void request(){
  7. System.out.println("连接网线上网!");
  8. }
  9. }

接口转换器的抽象方法

  1. package com.jialidun.gof.adapter;
  2.  
  3. //接口转换器的抽象实现
  4. public interface NetToUsb {
  5.  
  6. //作用:处理请求 网线插到USB上
  7. public void hanleRequest();
  8.  
  9. }

真正的适配器,需要连接USB,连接网线

  1. package com.jialidun.gof.adapter;
  2.  
  3. //真正的适配器,需要连接USB,连接网线
  4. //方式1 继承(类适配器、单继承)
  5. public class Adapter extends Adaptee implements NetToUsb{
  6.  
  7.  
  8. @Override
  9. public void hanleRequest() {
  10. super.request();//可以上网了
  11. }
  12. }

创建客户端,需要上网,网线不匹配

  1. package com.jialidun.gof.adapter;
  2.  
  3. //客户端类:想上网,插不上网线
  4. public class Computer {
  5.  
  6. //我们的电脑需要连接上转接器才可以上网
  7. public void net(NetToUsb adapter){
  8. //上网的具体实现,找一个转接头
  9.  
  10. adapter.hanleRequest();
  11.  
  12. }
  13.  
  14. public static void main(String[] args) {
  15. //电脑 适配器 网线
  16. Computer computer = new Computer();//电脑
  17. Adaptee adaptee = new Adaptee();//网线
  18. Adapter adapter = new Adapter();//转接器
  19.  
  20. computer.net(adapter);
  21.  
  22.  
  23.  
  24. }
  25. }

上面的例子有局限性,尽量不使用继承,修改方法

修改适配器

  1. package com.jialidun.gof.adapter;
  2.  
  3. //方式2 组合(对象适配器、常用)
  4. public class Adaapter2 implements NetToUsb{
  5. private Adaptee adaptee;
  6.  
  7. public Adaapter2(Adaptee adaptee){
  8. this.adaptee = adaptee;
  9. }
  10.  
  11.  
  12. @Override
  13. public void hanleRequest() {
  14. adaptee.request();
  15. }
  16. }

客户端

  1. package com.jialidun.gof.adapter;
  2.  
  3. //客户端类:想上网,插不上网线
  4. public class Computer {
  5.  
  6. //我们的电脑需要连接上转接器才可以上网
  7. public void net(NetToUsb adapter){
  8. //上网的具体实现,找一个转接头
  9.  
  10. adapter.hanleRequest();
  11.  
  12. }
  13.  
  14. public static void main(String[] args) {
  15. //电脑 适配器 网线
  16. // Computer computer = new Computer();//电脑
  17. // Adaptee adaptee = new Adaptee();//网线
  18. // Adapter adapter = new Adapter();//转接器
  19. //
  20. // computer.net(adapter);
  21.  
  22.  
  23. Computer computer = new Computer();//电脑
  24. Adaptee adaptee = new Adaptee();//网线
  25. Adaapter2 adaapter2 = new Adaapter2(adaptee);
  26. adaapter2.hanleRequest();
  27.  
  28.  
  29.  
  30. }
  31. }
  32.  

在这里插入图片描述

五、对象适配器有哪些优点

1.一个对象适配器可以把多个不同的适配者适配到同一个目标。

2.可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据"里氏替换原则",适配者的子类也可通过该适配器进行适配。

六、类适配器缺点

对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。

七、使用场景

系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需求,甚至没有这些类的源代码。
想创建一个重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
例如SpringMVC中DispacherServlet、HandlerAdpter等

到此这篇关于java设计模式之浅谈适配器模式的文章就介绍到这了,更多相关java适配器模式内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号