xiaoyi's blog
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub

xuexuguang

后端新秀
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub
  • PHP

  • Go

  • 算法

  • 设计模式

    • 类适配器模式
      • 是什么?
      • 代码示例
  • 学习笔记

  • 后端
  • 设计模式
xiaoyi
2019-12-25

类适配器模式

# 是什么?

看到这个名字就感觉很形象,什么叫适配呢? 这个场景,生活中还是蛮常见的,想想下我们的手机是如何跟电源通电的?就是通过适配器来进行通电的。我们可以随意的更换电源适配器来给手机充电,而无需改动电源插座跟手机。 在设计模式中,这叫做适配器啦。

** 模式结构 **

角色 责任描述
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

按照模式结构,我们还需要一个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

有了被适配者,确定需要适配的功能后,我们需要实现适配器来适配。

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

到这,我们简单的实现了一个适配器的功能,代码中可以看到通过继承的方式,重写了支付的方式,同时实现了target的通知功能。按照这种设计模式,我们可以随意的新增适配器而不需要去变更源类。 就跟电脑一样,我不关心你的插座是什么样,我只要提供不同的数据线就可以满足各个接口的需求。

不妨,看看实际的效果吧

// 原本的类的
$adaptee = new Adaptee();
$adaptee->pay(); // 支付¥34

// 适配器
$adapter = new Adapter();
$adapter->pay(); // 支付$5
$adapter->notify();
1
2
3
4
5
6
7
8

我们仅仅是新增了适配器就改变了支付方式,而不需要变更代码结构。之后如果需要扩展,只需要适配源类和实现target接口即可。

编辑
上次更新: 2020/12/31, 06:55:18
JS随机打乱数组
《Git》笔记

← JS随机打乱数组 《Git》笔记→

最近更新
01
MVC对比
12-31
02
负载均衡
12-31
03
数据库缓存优化
12-31
更多文章>
Theme by Vdoing | Copyright © 2020-2020 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式