java设计模式之浅谈适配器模式
作者:RYGAR 时间:2023-11-19 14:46:26
一、结构型模式
结构型模式有什么好处?
从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题
二、适配器模式
USB网线转换器
三、什么是适配器模式?
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本接口不兼容而不能一起工作的那些类能够变得在一起工作!
四、角色分析
目标接口:客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口
需要适配的类:需要适配的类或适配者类
适配器:通过包装一个需要适配的对象,把原接口转换成目标对象!
例子:
适配的类:网线
package com.jialidun.gof.adapter;
//要被适配的类:网线
public class Adaptee {
public void request(){
System.out.println("连接网线上网!");
}
}
接口转换器的抽象方法
package com.jialidun.gof.adapter;
//接口转换器的抽象实现
public interface NetToUsb {
//作用:处理请求 网线插到USB上
public void hanleRequest();
}
真正的适配器,需要连接USB,连接网线
package com.jialidun.gof.adapter;
//真正的适配器,需要连接USB,连接网线
//方式1 继承(类适配器、单继承)
public class Adapter extends Adaptee implements NetToUsb{
@Override
public void hanleRequest() {
super.request();//可以上网了
}
}
创建客户端,需要上网,网线不匹配
package com.jialidun.gof.adapter;
//客户端类:想上网,插不上网线
public class Computer {
//我们的电脑需要连接上转接器才可以上网
public void net(NetToUsb adapter){
//上网的具体实现,找一个转接头
adapter.hanleRequest();
}
public static void main(String[] args) {
//电脑 适配器 网线
Computer computer = new Computer();//电脑
Adaptee adaptee = new Adaptee();//网线
Adapter adapter = new Adapter();//转接器
computer.net(adapter);
}
}
上面的例子有局限性,尽量不使用继承,修改方法
修改适配器
package com.jialidun.gof.adapter;
//方式2 组合(对象适配器、常用)
public class Adaapter2 implements NetToUsb{
private Adaptee adaptee;
public Adaapter2(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void hanleRequest() {
adaptee.request();
}
}
客户端
package com.jialidun.gof.adapter;
//客户端类:想上网,插不上网线
public class Computer {
//我们的电脑需要连接上转接器才可以上网
public void net(NetToUsb adapter){
//上网的具体实现,找一个转接头
adapter.hanleRequest();
}
public static void main(String[] args) {
//电脑 适配器 网线
// Computer computer = new Computer();//电脑
// Adaptee adaptee = new Adaptee();//网线
// Adapter adapter = new Adapter();//转接器
//
// computer.net(adapter);
Computer computer = new Computer();//电脑
Adaptee adaptee = new Adaptee();//网线
Adaapter2 adaapter2 = new Adaapter2(adaptee);
adaapter2.hanleRequest();
}
}
五、对象适配器有哪些优点
1.一个对象适配器可以把多个不同的适配者适配到同一个目标。
2.可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据"里氏替换原则",适配者的子类也可通过该适配器进行适配。
六、类适配器缺点
对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
七、使用场景
系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需求,甚至没有这些类的源代码。
想创建一个重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
例如SpringMVC中DispacherServlet、HandlerAdpter等
来源:https://blog.csdn.net/m0_51067047/article/details/117569251
标签:java,适配器模式
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
详解spring cloud Feign使用中遇到的问题总结
2023-12-13 19:03:48
HelloSpringMVC注解版实现步骤解析
2021-07-21 01:58:42
Rxjava功能操作符的使用方法详解
2021-06-10 06:57:16
如何在Intellij中安装LeetCode刷题插件方便Java刷题
2023-10-16 21:38:08
![](https://img.aspxhome.com/file/2023/3/132023_0s.jpg)
IDEA创建Java项目文件并运行教程解析
2023-01-14 15:50:47
![](https://img.aspxhome.com/file/2023/8/66648_0s.png)
直接在线预览Word、Excel、TXT文件之ASP.NET
2021-10-07 15:37:54
C++中const的实现细节介绍(C,C#同理)
2022-10-21 19:43:12
Android实现图片循环播放的实例方法
2022-08-27 11:36:21
Java CPU性能分析工具代码实例
2023-09-28 04:52:54
C#程序执行时间长查询速度慢解决方案
2023-10-31 08:49:05
OpenTelemetry初识及调用链Trace详解
2021-08-03 12:37:14
![](https://img.aspxhome.com/file/2023/9/85549_0s.png)
基于springboot+vue实现垃圾分类管理系统
2023-04-17 08:39:11
![](https://img.aspxhome.com/file/2023/2/86862_0s.jpg)
WPF实现倒计时转场动画效果
2023-01-10 11:46:23
![](https://img.aspxhome.com/file/2023/9/119469_0s.png)
Android自定义View实现公交成轨迹图
2021-07-12 12:00:04
![](https://img.aspxhome.com/file/2023/6/138306_0s.jpg)
超详细的Java 问题排查工具单
2023-02-10 06:02:17
![](https://img.aspxhome.com/file/2023/4/84214_0s.png)
Spring事务注解@Transactional失效的八种场景分析
2022-03-09 13:36:13
Android获取手机的版本号等信息的代码
2021-09-21 06:00:26
ASP.NET C#中Application的用法教程
2023-09-16 14:09:32
详解Android开发中Activity的四种launchMode
2023-05-19 08:30:27
![](https://img.aspxhome.com/file/2023/9/139469_0s.jpg)
Java面向对象基础知识之封装,继承,多态和抽象
2022-11-18 07:35:59