设计模式之适配器模式

设计模式之适配器模式

我们实际中会用到两个不同接口的类的通信,在不修改两个类的前提下,使用新的中间类来完成衔接的过程,这个中间件就是适配器.可以让两个完全不同的接口相互转化.

适配器模式允许在适配器中包装其他不兼容的对象,以使其与另一个类兼容。

就如同生活中买了港版的手机,但是附赠的是三脚插头,而大陆上用的是两脚的,需要一个适配器来将三角插头转换为两脚的。其中这个中间件就是适配器。

应用场景

  • 当你想要这个类,但是类中的接口与想用的接口并不匹配
  • 当想要去创建一个可重用的类,让它与不相关或不可预见的类合作,这个类不必要有兼容的接口
  • 当你需要一系列的子类的时候,如果想要调整这些子类的接口方法的时候,对每一个接口子类化的这种方法是不可行的。这时就可使用适配器适配这些子类的夫类。

结构图

适配器模式图

使用client调用适配器,适配器继承与三脚插头,依赖于二脚插头。这样就可以使用三脚插头的接口调用二脚插头的方法。

代码

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
* 三角插头
* @Author nanyin
* @Date 11:13 2019-06-02
**/
public class ThreeLeggedPlug {
public void charge(){
System.out.println("use three legged plug");
}
}

/**
* 二脚插头
* @Author nanyin
* @Date 11:13 2019-06-02
**/
public class TwoLeggedPlug {
public void fastCharge(){
System.out.println("use two legged plug for fast charge !");
}
}
//适配器 继承三角插头
public class TwoLeggedPlugAdapter extends ThreeLeggedPlug {
TwoLeggedPlug twoLeggedPlug;
// 依赖于二脚插头
public TwoLeggedPlugAdapter() {
twoLeggedPlug = new TwoLeggedPlug();
}
//使用三角插头的charge方法,调用二脚插头的fastCharge方法
@Override
public void charge() {
twoLeggedPlug.fastCharge();
}
}

//某S9港版手机
public class S9Plus extends ThreeLeggedPlug {
ThreeLeggedPlug threeLeggedPlug;

public S9Plus(ThreeLeggedPlug threeLeggedPlug) {
this.threeLeggedPlug = threeLeggedPlug;
}

@Override
public void charge() {
threeLeggedPlug.charge();
}
}

//客户端方法
public class App {
@Test
public void testCharge() {
// 不使用适配器 使用类三角插头
ThreeLeggedPlug s9Plus = new S9Plus(new ThreeLeggedPlug());
s9Plus.charge();
// 使用二脚插头的适配器
ThreeLeggedPlug s9PlusUseTwoLeggedPlug = new S9Plus(new TwoLeggedPlugAdapter());
s9PlusUseTwoLeggedPlug.charge();
}
}
1
2
3
4
5
6
结果:

use three legged plug
use two legged plug for fast charge !

Process finished with exit code 0
-------------本文结束感谢您的阅读-------------

本文标题:设计模式之适配器模式

文章作者:NanYin

发布时间:2019年06月02日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/02/2019-06-02-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。