类适配器模式
# 是什么?
看到这个名字就感觉很形象,什么叫适配呢? 这个场景,生活中还是蛮常见的,想想下我们的手机是如何跟电源通电的?就是通过适配器来进行通电的。我们可以随意的更换电源适配器来给手机充电,而无需改动电源插座跟手机。 在设计模式中,这叫做适配器啦。
** 模式结构 **
角色 | 责任描述 |
---|---|
Adaptee(被适配者) | 需要被适配的类 |
Target(目标接口) | 定义需要适配的功能 |
Adapter(适配器类) | 适配 Adaptee 和 Target |
# 代码示例
首先我们定义一个源类,也就是被适配的类,该类支持支付功能
class Adaptee
{
/**
* 金额
*
* @var string
*/
public $money = '¥34';
/**
* 支付
*/
public function pay()
{
echo '支付' . $this->money;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
按照模式结构,我们还需要一个target,定义需要适配的功能,这里我们定义了两个方法,希望适配器可以适配支持支付和通知功能
interface Target
{
/**
* 支付
*
* @return mixed
*/
public function pay();
/**
* 通知
*
* @return mixed
*/
public function notify();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
有了被适配者,确定需要适配的功能后,我们需要实现适配器来适配。
class Adapter extends Adaptee implements Target {
/**
* Adapter constructor.
*/
public function __construct()
{
$this->money = '$5';
}
/**
* 通知
*/
public function notify()
{
echo '通知';
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
到这,我们简单的实现了一个适配器的功能,代码中可以看到通过继承的方式,重写了支付的方式,同时实现了target的通知功能。按照这种设计模式,我们可以随意的新增适配器而不需要去变更源类。 就跟电脑一样,我不关心你的插座是什么样,我只要提供不同的数据线就可以满足各个接口的需求。
不妨,看看实际的效果吧
// 原本的类的
$adaptee = new Adaptee();
$adaptee->pay(); // 支付¥34
// 适配器
$adapter = new Adapter();
$adapter->pay(); // 支付$5
$adapter->notify();
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
我们仅仅是新增了适配器就改变了支付方式,而不需要变更代码结构。之后如果需要扩展,只需要适配源类和实现target接口即可。
上次更新: 2020/12/31, 06:55:18