目录
  1. 1. 设计模式分类
  2. 2. 适配器模式
    1. 2.1. 实例:
  3. 3. 小结
  4. 4. 编程之外
Java适配器模式详解

在这里插入图片描述

设计模式分类

==设计模式分为三种类型,共23种:这里先暂时只分享适配器模式的学习==


适配器模式

  在应用程序中,我们可能需要让两个不同接口的类来进行通信,在不修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。这个中间件就是适配器。

适配器模式定义:将一个类的接口转换成客户期望的另一个接口,适配器(Adapter)让原本接口不兼容的类可以相互合作。


实例:

  现在市面上的笔记本电脑越来越薄,很多电脑就去掉了传统的那种网线接口,是插不了网线的。要插网线就需要通过USB网线转化器来实现,这里就有一些适配器的思想体现了。

  • USB网线转换器:一端连接电脑,另一端连接网线
    在这里插入图片描述

角色分析:

目标接口: 客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。(这里的电脑接口)

需要适配的类: 需要适配的类或适配者类。(网线)

适配器: 通过包装一个需要适配的对象,把原接口转换成目标对象!(USB网线转换器)


==三个类:网线,适配器,电脑==

网线抽象建模:

1
2
3
4
5
6
7
8
9
package adapter;

//要被适配的类:(这里的网线抽象)
public class Reticle {
//它(网线)的功能 --> 上网
public void request(){
System.out.println("成功连接网线上网了!");
}
}

适配器抽象建模:

==第一种方法:== 类适配器,这种方法是通过继承Reticle去实现的,但Java是单继承的,Adapter类只能去适配一个东西,实际开发中相对不适用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package adapter;

/**
* 具体的实现类:(真正的适配器) 需要连接电脑端的USB接口,连接网线
* 1.这个适配器需要去实现 NetToUsb 接口(重写接口的方法),这个接口最后会被[笔记本]电脑去处理
*
* 2.适配器需要去处理上网的请求,而上网真正是在网线上的,所以,适配器去继承Reticle(网线)即可
* */
public class Adapter extends Reticle implements NetToUsb{

@Override
public void handleRequest() {
//Adapter 的父类(Reticle)去调用上网的方法
super.request(); //可以上网了~
}
}

==第二种方法:== 对象适配器,通过组合来实现(常用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package adapter;

// 2.通过组合实现--》对象适配器(常用)
//接入网线

public class Adapter2 implements NetToUsb{

//网线私有,将网线组合进来
private Reticle reticle;

public Adapter2(Reticle reticle) {
this.reticle = reticle;
}

@Override
public void handleRequest() {
//直接调用Reticle的实现方法即可
reticle.request(); //可以上网了~
}
}

==适配器抽象为接口:==

1
2
3
4
5
6
7
8
9
10
package adapter;

/**
* 模拟接口转换器的接口,接口转换器的抽象实现~
* 通过实现这个接口,得到多个转换器
*/
public interface NetToUsb {
//作用:处理请求(将网线=>usb)
public void handleRequest();
}

电脑抽象建模:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package adapter;

//客户端类:(电脑的抽象~) 想上网,但插不了网线
public class Computer {
/**
* 电脑想要上网这个事件,对应一个抽象方法
*
* 电脑需要连接上转接器才可以上网,so,就给它传一个转接器的接口
* */
//上网的具体实现方法~
public void net(NetToUsb adapter){
// 需要一个转接头(参数)去调用具体实现类的方法来处理上网的请求
adapter.handleRequest();
}

//真实上网
public static void main(String[] args) {
//需要电脑,网线,适配器~
Computer computer = new Computer();
Reticle reticle = new Reticle();

//1.这种适配器是通过继承Reticle去实现的--》类适配器,
Adapter adapter = new Adapter();

// 2.通过组合去实现--》对象适配器(常用)
Adapter2 adapter2 = new Adapter2(reticle);


//1.调用上网的具体实现方法,给它一个转接器即可上网
//该方法:适配器已经继承了Reticle(网线)了---》使得适配器自带上网功能
computer.net(adapter);

//2.组合实现,先插网线再接电脑
computer.net(adapter2);

}

}

小结

  Computer(电脑)类 和 Reticle(网线)类没有任何关系,通过适配器将它们联系起来,从而实现了电脑上网
在这里插入图片描述


◆对象适配器优点

  • 一个对象适配器可以把多个不同的适配者适配到同一个目标
  • 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者
    的子类也可通过该适配器进行适配。

◆类适配器缺点

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

◆适用场景

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

编程之外

  学好设计模式,给世界进行更好的建模! 欢迎小伙伴入坑公众号 编程之外,学习更多的编程知识,寻找编程之外的乐趣,互相监督一起成长!😁😁可在公众号回复 ==pdf== ,获取Java学习和面试的资料!在这里插入图片描述

编程之外
文章作者: 遇见0和1
文章链接: http://vogos.cn/2020/04/16/Java%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 遇见0和1の个人客栈
打赏
  • 微信赞赏
  • 我的公众号

评论