适配器设计模式

什么是适配器设计模式

举个例子,手机电池是没法直接用插排充电的,所以需要一个充电器来将电流转换一下,这个充电器就是代码里面的 适配器模式

为什么要用适配器设计模式

可以在不改变原有类的功能的同时,满足客户的需求。

何时使用适配器设计模式

当原有类不符合客户的需求并且不能或不想修改原有类的情况下,可以考虑做一个适配器来适应客户的需求。

如何使用适配器设计模式

以下代码用手机充电举例,插排的电压为 220v,但是手机只能接收 5v 的电压,所以写了一个 Charger 充电器,来将 220v 的交流电转为 5v 的手机电压。

类适配器

php 中类适配器模式使用了继承类和实现接口两种方式来模拟多继承。

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

// 充电器例子

// 插排
class Board
{
protected $volt = 220;
public function providePower()
{
echo $this->volt.' volt power charging'.PHP_EOL;
}
}

// 充电器接口规范
interface ChargerInterface
{
public function charge();
}

// 继承具体的插排类,并且实现充电器接口
class Charger extends Board implements ChargerInterface
{
// 充电方法
public function charge()
{
$this->volt = 5;
return $this->providePower();
}
}

// 手机类
class Mobile
{
// 充电
public function charge()
{
$charge = new Charger();
$charge->charge();
}
}

$mobile = new Mobile();
$mobile->charge();

对象适配器

对象适配器,是通过委托的形式来实现的,将具体功能委托给类实例。

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
// 插排
class Board
{
public $volt = 220;
public function providePower()
{
echo $this->volt.' volt power charging'.PHP_EOL;
}
}

// 充电器接口规范
interface ChargerInterface
{
public function charge();
}

// 继承具体的插排类,并且实现充电器接口
class Charger implements ChargerInterface
{
private $board;

public function __construct(Board $board)
{
$this->board = $board;
}

// 充电方法
public function charge()
{
$this->board->volt = 5;
$this->board->providePower();
}
}

// 手机类
class Mobile
{
// 充电
public function charge()
{
$charge = new Charger(new Board());
$charge->charge();
}
}
$mobile = new Mobile();
$mobile->charge();

类图

未完待续。。。。。。