RISC-V生态全景解析(十二):YoC组件介绍系列二:AT组件

简介: 自上期开始,我们开启了YoC组件系列内容的介绍,并带大家了解了YoC的CSI组件。本期将为大家介绍的是YoC的AT组件。本文将详细阐述AT组件的使用原理,开发所需要的其他依赖组件资源,以及在网络方面的应用,以帮助广大开发者熟悉AT组件的使用。

“芯片开放社区“电子发烧友小组已上线~即日起各位用户也能在电子发烧友找到我们了,复制如下链接到浏览器打开,即可回帖,提问,参与有奖互动,还有机会参与我们的线上线下活动,欢迎各位用户及开发者加入小组~https://bbs.elecfans.com/group_1398

自上期开始,我们开启了YoC组件系列内容的介绍,并带大家了解了YoC的CSI组件。本期将为大家介绍的是YoC的AT组件。本文将详细阐述AT组件的使用原理,开发所需要的其他依赖组件资源,以及在网络方面的应用,以帮助广大开发者熟悉AT组件的使用。

01 简

1.1 AT命令

AT 即Attention,AT指令集是从终端设备(Terminal Equipment,TE)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter, TA)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的。

通过TA,TE发送AT指令来控制移动台(Mobile Station,MS)的功能,与GSM 网络业务进行交互。用户可以通过AT指令进行呼叫、短信、电话本、数据业务、传真等方面的控制。

AT指令是以AT作首,字符结束的字符串,AT指令的响应数据包在中。每个指令执行成功与否都有相应的返回。其他的一些非预期的信息(如有人拨号进来、线路无信号等),模块将有对应的一些信息提示,接收端可做相应的处理。

1.2 AT优点

  • 命令简单易懂,并且采用标准串口来收发AT命令,这样对设备控制大大简化了,转换成简单串口编程了。
  • AT命令提供了一组标准的硬件接口--串口。这个简化的硬件设计.较新的电信网络模块,几乎都采用串口硬件接口。
  • AT命令功能较全,可以通过一组命令完成设备的控制,完成呼叫、短信、电话本、数据业务、传真。

1.3 AT应用

基于AT自身具备的优点,使用起来简单直接,功能简洁,命令齐全,已经被应用到物联网领域,比如提供完整的AT命令联网功能和设备生产需要的AT命令产测功能等。

02 YoC网络设计

2.1 网络框架

截屏2021-11-22 下午8.09.58.png

YoC的网络框架支持以下两种方式上网:

  • 支持SoC 集成WiFi进行联网。
  • 支持AT指令访问外部的WiFi透传模组进行联网。

通过访问外部的WiFi透传模组进行联网除了需AT组件外,还需要有SAL, NEGMGR和WIFI驱动组件。各个组件负责的功能描述如下:

  • AT组件负责将上层调用的网络功能以AT命令发送给WiFi透传模组,同时接受WiFi透传模组的返回结果和数据返回给上层。
  • WiFi驱动为上层组件Netmgr和SAL提供硬件能力支持
  • Netmgr为上层提供完整网络管理功能。
  • SAL(Socket Abstract Layer)给网络应用程序提供准备的Socket APIs.

2.2 透传模组

截屏2021-11-22 下午8.10.06.png

YoC支持WiFi透传模组的开发,除了AT组件外,我们还需要有ERS、LWIP组件和WIFI驱动组件。其中:

  • ERS组件负责注册所有支持的AT命令,一旦AT Server收到AT命令后,马上进行命名解析,从注册的AT命令里找到对应的命令处理函数开始执行,如果是联网的Socket命令,就会通过调用LWIP组件获取相应的命令数据。
  • LwIP组件主要负责接收和发送Wi-Fi TCPIP数据包。
  • WiFi数据驱动主要为上层组件提供硬件能力。
  • AT组件负责从主控接受指令和返回命令结果数据给主控。

03 工作原理

3.1 基本框架

截屏2021-11-22 下午8.10.12.png

AT命令使用的场景必须存在AT Server和AT Client两个角色。AT Client负责发送AT命令请求给AT Server, AT Server处理完后,返回响应数据和结果给AT Client。通常的工作原理如下:

  • AT Client发送AT命令请求给AT Server。
  • AT Server接收到命令后,解析AT命令进行处理。
  • AT Server返回处理后AT命令和结果数据。
  • AT Client接收到返回AT命令后,解析AT命令后,按解析结果继续接受数据。

AT组件完成 AT 命令的发送、命令格式及参数判断、命令的响应、响应数据的接收、响应数据的解析、OOB 数据处理等整个 AT 命令数据交互流程。

3.2 AT Server

设备利用AT组件的Server 角色功能可以为其他设备提供自身功能, 其他的设备或上位机通过发送AT Server支持的AT命令来间接调用该设备的能力。比如,上位机通过发送AT命令获取该设备的状态和其他信息以及调用相关功能。

通常具有AT Server的能力的设备会支持一系列的AT命令集,这些命令集可以是标准的也可以扩展的。AT Client只有发送AT Server支持的AT命令才能被正确的接收处理。

3.3 AT Client

设备利用AT组件的Client角色功能可以访问其他具有AT Server功能的设备或模组,从而利用该类的设备或模组的功能实现联网或其他的功能。比如,设备通过发送AT指令给WiFi模组实现联网功能。

04 WiFi透传模组进行联网

本章节我们讲解如何通过访问外部的WiFi透传模组进行联网。

4.1 通道初始化

4.1.1 使用默认串口通道

在默认的情况下,AT组件使用UART串口来作为AT数据传输通道,可以使用一下接口进行通道的初始化。

atparser_uservice_t *atparser_init(utask_t *task, const char *name, uart_config_t *config)

4.1.2 使用自定义通道

如果实际用的数据通道不是UART串口,比如是SPI, 则可以利用以下的接口来重新进行通道的初始化。

atparser_uservice_t *atparser_channel_init(utask_t *task, const char *name, void *config, at_channel_t *channel);

通道的基本操作主要包括:通道初始化、事件回调、数据发送和数据收发。所以开发者用户需要自己移植这四个接口。

#define AT_CHANNEL_EVENT_READ  (1UL << 0)
#define AT_CHANNEL_EVENT_WRITE (1UL << 1)
#define AT_CHANNEL_OVERFLOW    (1UL << 2)
typedef void (*channel_event_t)(int event_id, void *priv);
typedef struct {
    void* (*init)(const char *name, void *config);                    //通道初始化
    int (*set_event)(void *hdl, channel_event_t evt_cb, void *priv);  //设置通道事件回调,包含数据到达,数据发送完成、数据溢出
    int (*send)(void *hdl, const char *data, int size);               //数据发送
    int (*recv)(void *hdl, const char *data, int size, int timeout);  //数据接收
} at_channel_t;

具体可以参考at/port/uart_aos.c里的串口实现。

4.2 命令收发

4.2.1 命令发送

AT Client通过atparser_send发送使用AT指令,发送的命令以ASCII码的子串且"AT"字符打头。

int atparser_send(atparser_uservice_t *at, const char *command, ...)

4.2.2 命名接收

AT Client通过atparser_recv接收指令,接受的数据以ASCII码的子串且"OK"字符结尾。

int atparser_recv(atparser_uservice_t *at, const char *response, ...)

4.3 AT指令实现

4.3.1 Wi-Fi功能接口实现

我们采用ESP8266的Wi-Fi模组,需要支持ESP8266 WiFi驱动接口,主要包括以下接口,用于初始化Wi-Fi模组,启动Wi-Fi功能,获取和设置工作模式以及获取当前联网状态等。具体ESP8266 AT指令说明参考第7章节。

static wifi_driver_t esp8266_wifi_driver = {
    .init                = esp8266_init,
    .deinit              = esp8266_deinit,
    .start               = esp8266_start,
    .stop                = esp8266_stop,
    .reset               = esp8266_reset,
    .set_mode            = esp8266_set_mode,
    .get_mode            = esp8266_get_mode,
    .sta_get_link_status = esp8266_drv_get_link_status,
    .set_smartcfg        = esp8266_smartconfig,
};

4.3.2 网络管理接口实现

网络管理模块需要获取设备的网络IP地址,MAC地址, DNS服务地址等信息,通过以下接口实现。具体ESP8266 AT指令说明参考第7章节。

static net_ops_t esp8266_net_driver = {
    .set_mac_addr   = esp8266_set_mac_addr,
    .start_dhcp     = NULL,/*esp8266_start_dhcp*/
    .stop_dhcp      = NULL,/*esp8266_stop_dhcp*/
    .set_ipaddr     = esp8266_set_ipaddr,
    .get_ipaddr     = esp8266_get_ipaddr,
    .get_mac_addr   = esp8266_get_mac_addr,
    .set_dns_server = esp8266_set_dns_server,
    .get_dns_server = esp8266_get_dns_server,
    .ping           = esp8266_ping_remote,
    .subscribe      = esp8266_subscribe,
};

4.3.3 SAL接口实现

SAL接口主要用于网络TCPIP通讯,包括数据传输,数据发送,连接管理等,通过以下接口实现。具体ESP8266 AT指令说明参考第7章节。

static sal_op_t esp8266_sal_driver = {
    .version                        = "1.0.0",
    .init                           = esp8266_wifi_module_init,
    .start                          = esp8266_wifi_module_conn_start,
    .send                           = esp8266_wifi_module_send,
    .domain_to_ip                   = esp8266_wifi_module_domain_to_ip,
    .close                          = esp8266_wifi_module_conn_close,
    .deinit                         = esp8266_wifi_module_deinit,
    .register_netconn_data_input_cb = esp8266_wifi_packet_input_cb_register,
    .register_netconn_close_cb      = esp8266_wifi_close_cb_register,
};

05 ESP8266 WiFi AT指令

5.1 测试AT语法规则:

命令类型 语法 返回和说明
执行命令 AT OK

5.2 WiFi功能AT指令

5.2.1 选择WiFi应用模式

AT+CWMODE语法规则:

命令类型 语法 返回和说明
设置命令 AT+CWMODE = <mode> OK


此指令需重启后生效(AT+RST)
查询命令 AT+CWMODE? +CWMODE:<mode>OK


当前处于哪种模式?
测试命令 AT+CWMODE? +CWMODE:(<mode>取值列表)OK


当前可支持哪些模式?

参数定义:

参数 定义 取值 对取值的说明
<mode> WiFi应用模式 1
Station模式


2 AP模式


3 AP+Station模式

5.2.2 列出当前可用接入点

AT+CWLAP语法规则:

命令类型 语法
返回和说明
执行命令 AT+CWLAP +CWLAP: <ecn>,<ssid>,<rssi>[,<mode>]OK


此指令返回AP列表

参数定义:

参数 定义 取值 对取值的说明
<ecn> 加密方式 0
OPEN


1
WEP


2 WPA_PSK


3 WPA2_PSK


4 WPA_WPA2_PSK
<ssid> 接入点名称
字符串参数
<rssi> 信号强度

<mode> 连接模式 0
手动连接


1 自动连接

5.2.3 加入接入点

AT+CWJAP语法规则:

命令类型 语法 返回和说明
设置命令 AT+CWJAP=<ssid>,<pwd> OK或ERROR


加入该AP成功则返回OK,失败则返回ERROR
查询命令 AT+CWJAP? +CWJAP:<ssid>OK


返回当前选择的AP

参数定义:

参数 定义 取值 对取值的说明
<ssid> 接入点名称
字符串型
<pwd> 密码
字符串型,最长64字节,ASCII编码

5.2.4 退出接入点

AT+CWQAP语法规则:

命令类型 语法 返回和说明
执行命令 AT+CWQAP OK


表示成功退出该AP
测试命令 AT+CWQAP=? OK


查询该命令是否支持

5.2.5 设置AP模式下的参数

AT+CWSAP语法规则:

命令类型 语法 返回和说明
设置命令 AT+CWSAP=<ssid>,<pwd>,<chl>, <ecn> OK


设置参数成功
查询命令 AT+CWSAP? OK


查询当前AP参数

参数定义:

参数 定义 取值 对取值的说明
<ecn> 加密方式 0
OPEN


1 WEP


2 WPA_PSK


3 WPA2_PSK


4 WPA_WPA2_PSK
<ssid> 接入点名称
字符串参数
<pwd> 密码
字符串型,最长64字节,ASCII编码
<chl> 通道号

5.2.6 建立TCP/UDP连接

AT+CIPSTART语法规则:

命令类型 语法 返回和说明
设置命令 单 路 连 接(+CIPMUX=0)时:AT+CIPSTART=<type>,<addr>,<port>多路连接(+CIPMUX=1)时:AT+CIPSTART=<id>,<type>,<addr>,<port> 如果格式正确,返回:OK否则返回:+CME ERROR: invalid input value连接成功,返回:CONNECT OK         (CPIMUX=0)<id>,CONNECT OK   (CIPMUX=1)如果连接已经存在,返回:ALREADY CONNECT连接失败返回:CONNECT FAIL        (CIPMUX=0)<id>,CONNECT FAIL  (CIPMUX=1)

参数定义:

参数 定义 取值 对取值的说明
<id> LinkNo. 0~4 表示连接序号0号连接可client或server连接,其他id只能用于连接远程server
<type> 连接类型 “TCP”/”UDP”
<addr> 远程服务器IP地址
字符串型
<port> 远程服务器端口号

5.2.7 连接状态

AT+CIPSTATUS语法规则:

命令类型 语法 返回和说明
执行命令 AT+CIPSTATUS 如果是单路连接(AT+CIPMUX=0),返回:OKSTATE: <sl_state>


如果是多路连接(AT+CIPMUX=1),返回:OKSTATE:<ml_state>


如果配置为服务器:STATE:IP STATUSS:<sid>,<port>,<server state>C:<cid>, <TCP/UDP>, <IP address>, <port>, <client state>
测试命令 AT+CIPSTATUS=? 返回:OK

参数定义:

参数 定义 取值 对取值的说明
<sl_state> 单连接状态 IP INITIAL 初始化


IP STATUS 获得本地IP状态


TCP CONNECTING/
UDP CONNECTING
TCP连接中/
UDP端口注册中


CONNECT OK 连接建立成功


TCP CLOSING/
UDP CLOSING
正在关闭TCP连接,正在注销UDP端口
<ml_state> 多链接状态 IP INITIAL 初始化


IP STATUS 获得本地IP状态
<sid> 服务器
id
0~1 取值为0和1
<server state> 服务器状态 OPENING 正在打开


LISTENING 正在监听


CLOSING 正在关闭
<cid> 客户端
id
0~4 取值为0,1,2,3,4
<IP address> IP地址 - 字符串参数(字符串需要加引号)
<port> 服务器监听端口号 - 整数型
<client state> 客户端状态 CONNECTED 已连接


CLOSED 已关闭

5.2.8 启动多连接

AT+CIPMUX语法规则:

命令类型 语法 返回和说明
设置命令 AT+CIPMUX=<mode> OK如果已经处于多连接模式,则返回Link is builded


启动多连接成功
查询命令 AT+CIPMUX? +CIPMUX:<mode>OK


查询当前是否处在多连接模式

参数定义:

参数 定义 取值 对取值的说明
<mode> 是否处在多连接模式 0
单连接模式


1 多连接模式

5.2.9 发送数据

AT+CIPSEND语法规则:

命令类型 语法 返回和说明
设置命令 单 路 连 接(+CIPMUX=0)时:AT+CIPSEND=<length>多路连接(+CIPMUX=1)时:AT+CIPSEND=<id>,<length> 响应 模块收到指令后先换行返回”>”,然后开始接收串口数据,当数据长度满length时发送数据如果未建立连接或连接被断开,返回ERROR如果数据发送成功,返回SEND OK


说明 发送指定长度的数据
测试指令 AT+CIPSEND? 响应 单路连接(AT+CIPMUX=0)返回:+CIPSEND: <length>OK



多路连接(AT+CIPMUX=1)返回:+CIPSEND: <0-7>,<length>OK
执行命令 AT+CIPSEND 说明 AT+CIPMODE=1并且作为客户端模式下,进入透传模式(需要支持硬件流控,否则大量数据情况下会丢数据)模块收到指令后先换行返回”>”,然后会发送串口接收到的数据。

参数定义:

参数 定义 取值 对取值的说明
<length> 数据长度
单位:字节
<id> LinkNo. 0~4 连接序号

5.2.10 关闭TCP/UDP连接

AT+CIPCLOSE语法规则:

命令类型 语法 返回和说明
设置命令 单路连接时AT+CIPCLOSE=<id> 返回:CLOSE OK

多路连接时AT+CIPCLOSE=<n>[,<id>] 返回:<n>,CLOSE OK
执行命令 AT+CIPCLOSE 如果关闭成功,返回:CLOSE OK如果关闭失败,返回:ERROR
测试命令 AT+CIPCLOSE? 返回:OK
注意事项 l 执行命令只对单链接有效,多链接模式下返回
ERROR

  • 执行命令AT+CIPCLOSE只有在TCP/UDP CONNECTING或CONNECT OK状态下才会关闭连接,否则会认为关闭失败返回ERROR
  • 单路连接模式下,关闭后的状态为IP CLOSE

参数定义:

参数 定义 取值 对取值的说明
<id> 关闭模式 0 慢关(缺省值)


1
快关
<n> LinkNo. 0~7 整数型,表示连接序号

5.2.11 获取本地IP地址

AT+CIFSR语法规则

命令类型 语法 响应和说明
执行命令 AT+CIFSR 响应 + CIFSR:<IP address>OK或者ERROR
测试命令 AT+CIFSR=? 响应 OK

参数定义:

参数 定义 取值 对取值的说明
<IP address> 本机目前的IP地址(station)

5.2.12 选择TCPIP应用模式

AT+CIPMODE语法规则:

命令类型 语法 返回
设置命令 AT+CIPMODE=<mode> OK
查询命令 AT+CIPMODE? +CIPMODE: <mode>OK

参数定义:

参数 定义 取值 对取值的说明
<mode> TCPIP应用模式 0
非透明传输模式,缺省模式


1
透明传输模式

5.2.13 设置服务器主动断开的超时时间

AT+CIPSTO语法规则:

[size=9.5000pt]
命令类型
[size=9.5000pt]语法 [size=9.5000pt]
返回和说明
设置命令 AT+CIPSTO=<server
timeout>
OK
查询命令 AT+CIPSTO? +CIPSTO:<server
timeout>OK

[size=9.5000pt][size=9.5000pt]参数定义:

[size=9.5000pt]参数 [size=9.5000pt]定义 [size=9.5000pt]取值 对取值的说明
<server timeout> 用来设置服务器主动断开连接的超时时间 0~28800(s) 用本命令设置好超时时间后,服务器到时间就断开连接。

5.2.14 设置波特率

AT+CIOBAUD语法规则:

命令类型 语法 返回和说明
设置命令 AT+CIOBAUD=<rate> 返回:

OK 默认波特率是9600参数定义:

参数 定义 取值 对取值的说明
<rate> 波特率,单位bps 0 自适应波特率


110


300


1200


2400


4800


9600


14400


19200


28800


38400


57600


115200


230400


460800


921600

06 下期预告

AT组件对AT指令的接收和发送进行了有效封装,为上层的应用提供提供了统一的调用接口,对下层的物理通道接口适配封装,保证上层的应用不用关心底层物理通道的通讯实现,大大减少了用户应用代码开发。

以上即为AT组件的全部介绍,下期内容我们将带来YoC的AV(多媒体)组件介绍,欢迎大家持续关注RISC-V系列内容。

相关文章
|
15天前
|
前端开发 JavaScript
React 步骤条组件 Stepper 深入解析与常见问题
步骤条组件是构建多步骤表单或流程时的有力工具,帮助用户了解进度并导航。本文介绍了在React中实现简单步骤条的方法,包括基本结构、状态管理、样式处理及常见问题解决策略,如状态管理库的使用、自定义Hook的提取和CSS Modules的应用,以确保组件的健壮性和可维护性。
54 17
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
245 2
|
21天前
|
前端开发 UED
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
48 8
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
44 1
|
2月前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
235 2
|
2月前
|
机器学习/深度学习 编解码 算法
深入解析MaxFrame:关键技术组件及其对视频体验的影响
【10月更文挑战第12天】随着流媒体服务和高清视频内容的普及,用户对于视频质量的要求越来越高。为了满足这些需求,许多技术被开发出来以提升视频播放的质量。其中,MaxFrame是一种旨在通过一系列先进的图像处理算法来优化视频帧的技术。本文将深入探讨构成MaxFrame的核心组件,包括运动估计、超分辨率重建以及时间插值算法,并讨论这些技术如何协同工作以改善视频播放效果。
48 1
|
1月前
|
机器学习/深度学习 自然语言处理 数据管理
GraphRAG核心组件解析:图结构与检索增强生成
【10月更文挑战第28天】在当今数据科学领域,自然语言处理(NLP)和图数据管理技术的发展日新月异。GraphRAG(Graph Retrieval-Augmented Generation)作为一种结合了图结构和检索增强生成的创新方法,已经在多个应用场景中展现出巨大的潜力。作为一名数据科学家,我对GraphRAG的核心组件进行了深入研究,并在此分享我的理解和实践经验。
75 0
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
2天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多