盒子
盒子
文章目录
  1. 诡异的现象
  2. 接口适配
  3. 类适配器
  4. 对象适配器

PHP适配器模式之找不到合适的接口

诡异的现象

不知道大家是否有过一个疑问,当你想把USB插进接口的时候,总是会这样:

  1. 第一次插进去,不行
  2. 反过来(旋转180度),再插,还是不行
  3. 再反过来(回到最开始),进去了!

这个接口结合的过程,是建立在双方遵循一致协议的情况下才会发生的,今天讨论的情况是,

  1. 第一次插进去,不行
  2. 反过来(旋转180度),再插,还是不行
  3. 再反过来(回到最开始),仍旧不行!
  4. 我擦,是不是拿错接口了!

接口适配

  • 既然接口不合适,那怎么办?买一个?可以~ 请关闭此文章~
  • 利用现有接口进行适配

可以看出,现有插座只有三口的,而我的插头是两口的,这表示,接口不兼容。这种情况下,可以通过第三方(三口中间件)来进行适配。这个适配器其实就是在原来的基础上增加了额外的功能,是对原有功能的一种扩展,在不改变原来接口的基础上,使得两个互不兼容的接口可以一起工作。

适配器模式有两种实现方式,一种是类适配器,另一种是对象适配器

类适配器

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
/**
* 目标角色
*/
interface Target {

/**
* 两口
*/
public function echo2plug();

/**
* 一口
*/
public function echo1plug();
}

/**
* 两口插头
*/
class TwoPlug {

/**
* 两口
*/
public function echo2plug() {
echo '2 plug';
}
}

/**
* 三口适配器
*/
class ThreePlugAdapter extends TwoPlug implements Target {

/**
* 新增一口
*/
public function echo1plug() {
echo '1 plug';
}

}

class Client {

/**
* Main program.
*/
public static function main() {
$adapter = new ThreePlugAdapter();
$adapter->echo2plug();
$adapter->echo1plug();
}

}

Client::main();

如上代码所示,类适配器使用继承,三口插头继承于两口插头。

对象适配器

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
62
63
64
65
66
67
68
69
/**
* 目标角色
*/
interface Target {

/**
* 两口
*/
public function echo2plug();

/**
* 一口
*/
public function echo1plug();
}

/**
* 两口插头
*/
class TwoPlug {

/**
* 两口
*/
public function echo2plug() {
echo '2 plug';
}
}

/**
* 三口适配器
*/
class ThreePlugAdapter implements Target {
private $_twoPlug;

public function __construct(TwoPlug $twoPlug) {
$this->_twoPlug = $twoPlug;
}

/**
* 两口
*/
public function echo2plug() {
$this->_twoPlug->echo2plug();
}

/**
*
*/
public function echo1plug() {
echo '1 plug';
}

}

class Client {

/**
* Main program.
*/
public static function main() {
$adapter = new ThreePlugAdapter(new TwoPlug);
$adapter->echo2plug();
$adapter->echo1plug();
}

}

Client::main();

如上代码所示,对象适配器使用的是依赖注入,对于三口插头适配器而言,可一次性给多个两口插头添加一口(添加功能)。

请我喝一杯咖啡
扫一扫,支持funsoul
  • 微信扫一扫