java设计模式之浅谈适配器模式
作者:RYGAR 发布时间:2023-11-19 14:46:26
标签:java,适配器模式
一、结构型模式
结构型模式有什么好处?
从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题
二、适配器模式
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
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- Mybatis无法获取带有下划线前缀的字段的值今天下面,把几张表里的字段都加了前缀,如 article_id,article_title,a
- 使用Android Studio 创建Android项目,分享给大家(1) 说明:还有一部分人在坚持使用 Eclipse ,建议抓紧换掉。使
- 前言接口调试是每个软件开发从业者必不可少的一项技能,一个项目的的完成,可能接口测试调试的时间比真正开发写代码的时间还要多,几乎是每个开发的日
- 如果一个项目内有很多个界面,那么在layout下会有太多的activity***.xml文件,这个时候就需要使用文件夹对这些分别存放了。当然
- 题目:将一个数组逆序输出。代码:import java.util.*;public class lianxi31 {public stati
- 前言Activity是Android中一个很重要的概念,堪称四大组件之首,关于Activity有很多内容,比如生命周期和启动Flags,这二
- 要求:1.通过手指移动来拖动图片 2.控制图片不能超出屏幕显示区域技术点:1.MotionEvent处理2.对View进行动态定位
- 类的结构包括 :1. 成员变量2. 成员方法3. 构造方法4. 代码块5. 内部类第一 构造方法的作用主要有以下三方面的作用:(1)在构造方
- Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型。Java中的基本数据类型名称大小取值范围byte型 (字节)8bit-12
- 前言这是该工具的github地址:https://github.com/pingfangushi/screw一、引入pom.xml依赖<
- package com.test;import org.htmlparser.Node;import org.htmlparser.Node
- 普通Java-Kotlin类添加注释添加类时注释作者信息和日期时间依次打开File—>Settings—>editor—>
- 背景在我们日常开发中,多线程管理一直是非常头疼的问题之一,尤其在历史性长,结构复杂的app中,线程数会达到好几百个甚至更多,然而过多的线程不
- Qt文件操作类QFile简介Qt中使用QFile类来操作文件的输入/输出。继承至QIODevice,QIODevice类是输入/输出设备的基
- Spring Cloud Gateway(以下简称 SCG)做为网关服务,是其他各服务对外中转站,通过 SCG 进行请求转发。在请求到达真正
- MyBatis Generator简介MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成
- 很多人对 Android提供的ImageButton有个疑问,当显示Drawable图片时就不会再显示文字了,其实解决的方法有三种: 第一种
- 最近使用到了maven的profile功能,发现这个功能的确很好用也很实用,这块的知识比较多也比较乱,其实真正理解了之后非常简单,为了巩固总
- C# 从枚举值获取对应的文本描述详解有时枚举值在显示时,需要显示枚举值对应的文本串。一种方案是在调用的地方使用switch或者if来判断枚举
- 在开发应用过程中,客户端与服务端经常需要进行数据传输,涉及到重要隐私信息时,开发者自然会想到对其进行加密,即使传输过程中被“有心人”截取,也