【Java开发】设计模式 05:适配器模式
创始人
2024-06-02 07:25:59
0次

1 适配器模式介绍

适配器模式(Adapter Pattern)属于结构型模式(结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。)。

将一个接口转换为客户端所期待的接口,从而使两个接口不兼容的类可以在一起工作

📌 场景

  • 当需要使用一个现存的类,但它提供的接口与我们系统的接口不兼容,而我们还不能修改它时;

  • 当多个团队独立开发系统的各功能模块,然后组合在一起,但由于某些原因事先不能确定接口时。

📌 适配器模式中出现的角色

在适配器模式中,主要存在四个角色

  • Target—NetToUsb(目标):目标定义了请求者所要使用的功能,是一种标准,具体实现可交由不同的适配器采用不同的方法进行实现;

  • Adapter—(适配器):负责实现转换功能的对象,同时其功能的实现需要符合目标中定义的标准;

  • Adaptee—NetLine(被适配的对象):需要被适配器转换的对象;

  • Client—Computer(请求者):即需要使用适配器的对象,本文是直接调用NetToUsb,由适配器来具体实现,而不用关心适配的具体过程。

适配器模式分为类适配器和对象适配器。

2 类适配器

📌 UML图

📌1.定义电脑

/*** 电脑* 

想上网,需要插网线*/ public class Computer{/*** 电脑需要连接上转换器才可以上网*/public void connect(NetToUsb adapter){// 上网的具体实现,找一个转接头adapter.connectNetLine();} }

📌2.定义usb转网口转接器

/*** 转接器*/
public interface NetToUsb {/*** 处理请求,usb -> 网线*/void connectNetLine();}

📌3.定义网线

/*** 网线*/
public class NetLine {/*** 上网*/public void online(){System.out.println("连接网线上网");}
}

📌4.定义类适配器

/*** 类适配器*/
public class ClassAdapter extends NetLine implements NetToUsb{@Overridepublic void connectNetLine() {// 可以上网了super.online();}
}

📌5.使用

// 电脑
Computer computer = new Computer();
// 转接器已经插上网线
ClassAdapter adapter = new ClassAdapter();
// 电脑连接转接器,成功上网
computer.connect(adapter);

这种实现方式的适配器需要占用一个继承位。如果此时 NetToUsb 不是接口而是抽象类的话,由于 Java 不支持多继承,就无法实现了。同时根据合成复用原则,应该更多的通过合成的方式去实现功能。

3 对象适配器

这是更为常用的一种模式。

📌 UML图

前三步照旧~

📌5.定义对象适配器

public class ObjectAdapter implements NetToUsb{//网线private NetLine netLine;public ObjectAdapter(NetLine netLine){this.netLine = netLine;}@Overridepublic void connectNetLine() {// 可以上网了netLine.online();}
}

📌5.使用

// 电脑
Computer computer = new Computer();
// 网线
NetLine netLine = new NetLine();
// 转接器插上网线
ObjectAdapter adapter = new ObjectAdapter(netLine);
// 电脑连接转接器,成功上网
computer.connect(adapter);

这样的方式不会占用继承位,且满足合成复用原则,耦合度更低,也更加灵活,推荐使用。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...