使用cJSON库解析JSON

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: cJSON库的下载cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要#include "cJSON.h"就可以使用了,库源码下载地址:cJSON downloadJSON官方网站:json只包含键值对的JSON字符串解析JSON字符串:{ "name": "Andy", //键值对1 "age": 20 //键值对2}这个JSON对象只有两个键值对,键name对应字符串Andy,键age对应数字20。

cJSON库的下载

cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要#include "cJSON.h"就可以使用了,

只包含键值对的JSON字符串解析

JSON字符串:

{
    "name": "Andy",      //键值对1
    "age": 20              //键值对2
}

img_00077e283c07754189106221b6886c4b.gif

这个JSON对象只有两个键值对,键name对应字符串Andy,键age对应数字20。

void Parse_Str1(void)
{
    char str1[] = "{\"name\":\"Andy\",\"age\":20}";
    cJSON *str1_json, *str1_name, *str1_age;
    printf("str1:%s\n\n",str1);
    str1_json = cJSON_Parse(str1);   //创建JSON解析对象,返回JSON格式是否正确
    if (!str1_json)
    {
        printf("JSON格式错误:%s\n\n", cJSON_GetErrorPtr()); //输出json格式错误信息
    }
    else
    {
        printf("JSON格式正确:\n%s\n\n",cJSON_Print(str1_json) );
        str1_name = cJSON_GetObjectItem(str1_json, "name"); //获取name键对应的值的信息
        if (str1_name->type == cJSON_String)
        {
            printf("姓名:%s\r\n", str1_name->valuestring);
        }
        str1_age = cJSON_GetObjectItem(str1_json, "age");   //获取age键对应的值的信息
        if(str1_age->type==cJSON_Number)
        {
            printf("年龄:%d\r\n", str1_age->valueint);
        }
        cJSON_Delete(str1_json);//释放内存
    }
}

运行结果:

img_61fc79a08bbf52c8c70cb341beffdadb.jpe

包含数组的JSON字符串解析

JSON字符串:

{
    "location": [{
            "name": "Faye",
            "address": "北京"
        },
        {
            "name": "Andy",
            "address": "香港"
        }
    ],
    "time": "2018-11-17"
}

img_27be471d9d5c0a9604216fb55d1401df.gif

解析函数:

void Parse_Str2(void)
{

    char str2[] = "{\"location\":[{\"name\":\"Faye\",\"address\":\"北京\"},{\"name\":\"Andy\",\"address\":\"香港\"}],\"time\":\"2018-11-17\"}";

    cJSON *root = 0;
    cJSON *loc_json = 0;
    cJSON *name1_json,*name2_json;
    char *time_str, *str_tmp;

    root = cJSON_Parse(str2);
    if(!root)
        printf("str2 JSON格式错误:%s \r\n", cJSON_GetErrorPtr());
    else
    {
        printf("str2 JSON格式正确:\n%s\n",cJSON_Print(root));
        time_str = cJSON_GetObjectItem(root,"time")->valuestring;//time键值对
        printf("time:%s\n", time_str);

        loc_json = cJSON_GetObjectItem(root,"location");
        if(loc_json)
        {
            name1_json = cJSON_GetArrayItem(loc_json,0);        //数组第0个元素
            str_tmp = cJSON_GetObjectItem(name1_json, "name")->valuestring;//name键对应的值
            printf("name1 is : %s \r\n", str_tmp);
            str_tmp = cJSON_GetObjectItem(name1_json, "address")->valuestring;//addr1键对应的值
            printf("addr1 is : %s \r\n", str_tmp);

            name2_json = cJSON_GetArrayItem(loc_json,1);       //数组第1个元素
            str_tmp = cJSON_GetObjectItem(name2_json, "name")->valuestring;
            printf("name2 is : %s \r\n", str_tmp);
            str_tmp = cJSON_GetObjectItem(name2_json, "address")->valuestring;
            printf("addr2 is : %s \r\n", str_tmp);
        }
    }
    cJSON_Delete(loc_json);
}

运行结果:

img_e724a49bf9dbd8fbb683bea06b7edc16.jpe

北京时间JSON数据解析

api地址:

http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json

JSON字符串:

{
    "success": "1",
    "result": {
        "timestamp": "1543922613",
        "datetime_1": "2018-12-04 19:23:33",
        "datetime_2": "2018年12月04日 19时23分33秒",
        "week_1": "2",
        "week_2": "星期二",
        "week_3": "周二",
        "week_4": "Tuesday"
    }
}                               

解析函数:

void Parse_BJ_Time(void)
{
    char bj_time_str[] = "{\"success\":\"1\",\"result\":{\"timestamp\":\"1542456793\",\"datetime_1\":\"2018-11-17 20:13:13\",\"datetime_2\":\"2018年11月17日 20时13分13秒\",\"week_1\":\"6\",\"week_2\":\"星期六\",\"week_3\":\"周六\",\"week_4\":\"Saturday\"}}";

    cJSON *root;
    cJSON *result_json;
    char *datetime, *week;

    root = cJSON_Parse(bj_time_str);
    if(root)
    {
        printf("json格式正确:\n%s\n\n", cJSON_Print(root));
        result_json =  cJSON_GetObjectItem(root, "result");  //获取result键对应的值
        if(result_json)
        {
            datetime = cJSON_GetObjectItem(result_json, "datetime_2")->valuestring;
            printf("北京时间: %s \r\n", datetime);
            week = cJSON_GetObjectItem(result_json, "week_2")->valuestring;
            printf("星期: %s \r\n", week);
        }
    }
    cJSON_Delete(root);
    cJSON_Delete(result_json);
}

运行结果:

img_689259f5c62182725170c111f4ca0157.jpe

心知天气JSON数据解析

JSON字符串:

{
    "results": [{
        "location": {
            "id": "WS10730EM8EV",
            "name": "深圳",
            "country": "CN",
            "path": "深圳,深圳,广东,中国",
            "timezone": "Asia/Shanghai",
            "timezone_offset": "+08:00"
        },
        "daily": [{
            "date": "2018-11-18",
            "text_day": "多云",
            "code_day": "4",
            "text_night": "多云",
            "code_night": "4",
            "high": "26",
            "low": "20",
            "precip": "",
            "wind_direction": "无持续风向",
            "wind_direction_degree": "",
            "wind_speed": "10",
            "wind_scale": "2"
        }, {
            "date": "2018-11-19",
            "text_day": "小雨",
            "code_day": "13",
            "text_night": "小雨",
            "code_night": "13",
            "high": "25",
            "low": "20",
            "precip": "",
            "wind_direction": "无持续风向",
            "wind_direction_degree": "",
            "wind_speed": "10",
            "wind_scale": "2"
        }, {
            "date": "2018-11-20",
            "text_day": "小雨",
            "code_day": "13",
            "text_night": "小雨",
            "code_night": "13",
            "high": "25",
            "low": "21",
            "precip": "",
            "wind_direction": "无持续风向",
            "wind_direction_degree": "",
            "wind_speed": "10",
            "wind_scale": "2"
        }],
        "last_update": "2018-11-18T11:00:00+08:00"
    }]
}

解析函数:

void parse_seniverse_weather(void)
{
    char weather_str[] =
        "{\"results\":[{\"location\":{\"id\":\"WS10730EM8EV\",\"name\":\"深圳\",\"country\":\"CN\",\"path\":\"深圳,深圳,广东,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"daily\":[{\"date\":\"2018-11-18\",\"text_day\":\"多云\",\"code_day\":\"4\",\"text_night\":\"多云\",\"code_night\":\"4\",\"high\":\"26\",\"low\":\"20\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2018-11-19\",\"text_day\":\"小雨\",\"code_day\":\"13\",\"text_night\":\"小雨\",\"code_night\":\"13\",\"high\":\"25\",\"low\":\"20\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2018-11-20\",\"text_day\":\"小雨\",\"code_day\":\"13\",\"text_night\":\"小雨\",\"code_night\":\"13\",\"high\":\"25\",\"low\":\"21\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"}],\"last_update\":\"2018-11-18T11:00:00+08:00\"}]}";
    cJSON *root;
    cJSON *results;
    cJSON *last_update;
    cJSON *loc_json, *daily_json;
    cJSON *forecast_json;
    char *loc_tmp, *weather_tmp, *update_tmp;
    int i = 0;

    root = cJSON_Parse((const char*)weather_str);
    if(root)
    {
//        printf("JSON格式正确:\n%s\n\n",cJSON_Print(root));    //输出json字符串
        results = cJSON_GetObjectItem(root, "results");
        results = cJSON_GetArrayItem(results,0);
        if(results)
        {
            loc_json = cJSON_GetObjectItem(results, "location");   //得到location键对应的值,是一个对象

            loc_tmp = cJSON_GetObjectItem(loc_json, "id") -> valuestring;
            printf("城市ID:%s\n",loc_tmp);
            loc_tmp = cJSON_GetObjectItem(loc_json, "name") -> valuestring;
            printf("城市名称:%s\n",loc_tmp);
            loc_tmp = cJSON_GetObjectItem(loc_json, "timezone") -> valuestring;
            printf("城市时区:%s\n\n",loc_tmp);

            daily_json = cJSON_GetObjectItem(results, "daily");
            if(daily_json)
            {
                for(i = 0; i < 3; i++)
                {
                    forecast_json = cJSON_GetArrayItem(daily_json, i);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "date") -> valuestring;
                    printf("日期:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "code_day") -> valuestring;
                    printf("白天天气代码:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "code_night") -> valuestring;
                    printf("晚上天气代码:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "high") -> valuestring;
                    printf("最高温度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "low") -> valuestring;
                    printf("最低温度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_direction_degree") -> valuestring;
                    printf("风向角度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_scale") -> valuestring;
                    printf("风力:%s\r\n\n", weather_tmp);
                }
            }
            else
                printf("daily json格式错误\r\n");
            last_update = cJSON_GetObjectItem(results, "last_update");
            update_tmp = last_update->valuestring;
            if(last_update)
            {
                printf("更新时间:%s\r\n", update_tmp);
            }
        }
        else
        {
            printf("results格式错误:%s\r\n", cJSON_GetErrorPtr());
        }
    }
    else
    {
        printf("JSON格式错误\r\n");
    }
    cJSON_Delete(root);
    cJSON_Delete(results);
}

运行结果:

img_0aebd7a4f2c1412c24685acd1a69fd2a.jpe

和风天气数据解析

JSON字符串:

{
    "HeWeather6": [{
        "basic": {
            "cid": "CN101010700",
            "location": "昌平",
            "parent_city": "北京",
            "admin_area": "北京",
            "cnty": "中国",
            "lat": "40.21808624",
            "lon": "116.23590851",
            "tz": "+8.00"
        },
        "update": {
            "loc": "2018-11-21 21:45",
            "utc": "2018-11-21 13:45"
        },
        "status": "ok",
        "daily_forecast": [{
            "cond_code_d": "100",
            "cond_code_n": "100",
            "cond_txt_d": "晴",
            "cond_txt_n": "晴",
            "date": "2018-11-21",
            "hum": "21",
            "mr": "16:02",
            "ms": "04:27",
            "pcpn": "0.0",
            "pop": "0",
            "pres": "1030",
            "sr": "07:08",
            "ss": "16:53",
            "tmp_max": "9",
            "tmp_min": "-3",
            "uv_index": "5",
            "vis": "10",
            "wind_deg": "323",
            "wind_dir": "西北风",
            "wind_sc": "1-2",
            "wind_spd": "4"
        }, {
            "cond_code_d": "100",
            "cond_code_n": "101",
            "cond_txt_d": "晴",
            "cond_txt_n": "多云",
            "date": "2018-11-22",
            "hum": "21",
            "mr": "16:36",
            "ms": "05:33",
            "pcpn": "0.0",
            "pop": "0",
            "pres": "1030",
            "sr": "07:09",
            "ss": "16:52",
            "tmp_max": "8",
            "tmp_min": "-4",
            "uv_index": "3",
            "vis": "20",
            "wind_deg": "35",
            "wind_dir": "东北风",
            "wind_sc": "1-2",
            "wind_spd": "5"
        }, {
            "cond_code_d": "101",
            "cond_code_n": "100",
            "cond_txt_d": "多云",
            "cond_txt_n": "晴",
            "date": "2018-11-23",
            "hum": "23",
            "mr": "17:15",
            "ms": "06:41",
            "pcpn": "0.0",
            "pop": "16",
            "pres": "1024",
            "sr": "07:10",
            "ss": "16:52",
            "tmp_max": "7",
            "tmp_min": "-2",
            "uv_index": "2",
            "vis": "20",
            "wind_deg": "305",
            "wind_dir": "西北风",
            "wind_sc": "1-2",
            "wind_spd": "3"
        }]
    }]
}

解析函数:

//解析和风天气,格式和心知天气非常像
void parse_heweather(void)
{
    char heweather_str[] = "{\"HeWeather6\":[{\"basic\":{\"cid\":\"CN101010700\",\"location\":\"昌平\",\"parent_city\":\"北京\",\"admin_area\":\"北京\",\"cnty\":\"中国\",\"lat\":\"40.21808624\",\"lon\":\"116.23590851\",\"tz\":\"+8.00\"},\"update\":{\"loc\":\"2018-11-21 21:45\",\"utc\":\"2018-11-21 13:45\"},\"status\":\"ok\",\"daily_forecast\":[{\"cond_code_d\":\"100\",\"cond_code_n\":\"100\",\"cond_txt_d\":\"晴\",\"cond_txt_n\":\"晴\",\"date\":\"2018-11-21\",\"hum\":\"21\",\"mr\":\"16:02\",\"ms\":\"04:27\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1030\",\"sr\":\"07:08\",\"ss\":\"16:53\",\"tmp_max\":\"9\",\"tmp_min\":\"-3\",\"uv_index\":\"5\",\"vis\":\"10\",\"wind_deg\":\"323\",\"wind_dir\":\"西北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"4\"},{\"cond_code_d\":\"100\",\"cond_code_n\":\"101\",\"cond_txt_d\":\"晴\",\"cond_txt_n\":\"多云\",\"date\":\"2018-11-22\",\"hum\":\"21\",\"mr\":\"16:36\",\"ms\":\"05:33\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1030\",\"sr\":\"07:09\",\"ss\":\"16:52\",\"tmp_max\":\"8\",\"tmp_min\":\"-4\",\"uv_index\":\"3\",\"vis\":\"20\",\"wind_deg\":\"35\",\"wind_dir\":\"东北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"5\"},{\"cond_code_d\":\"101\",\"cond_code_n\":\"100\",\"cond_txt_d\":\"多云\",\"cond_txt_n\":\"晴\",\"date\":\"2018-11-23\",\"hum\":\"23\",\"mr\":\"17:15\",\"ms\":\"06:41\",\"pcpn\":\"0.0\",\"pop\":\"16\",\"pres\":\"1024\",\"sr\":\"07:10\",\"ss\":\"16:52\",\"tmp_max\":\"7\",\"tmp_min\":\"-2\",\"uv_index\":\"2\",\"vis\":\"20\",\"wind_deg\":\"305\",\"wind_dir\":\"西北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"3\"}]}]}";

    cJSON *root;
    cJSON *results;
    cJSON *basic_json, *update_json, *forecast_json;
    cJSON *daily_json;

    int i = 0;
    char *basic_tmp, *update_tmp, *status_tmp, *weather_tmp;
    root = cJSON_Parse(heweather_str);
    if(root)
    {
        results = cJSON_GetObjectItem(root, "HeWeather6");      //HeWeather键对应的值,是一个数组
        results = cJSON_GetArrayItem(results,0);
        if(results)
        {
            basic_json = cJSON_GetObjectItem(results, "basic");
            if(basic_json)
            {
                basic_tmp = cJSON_GetObjectItem(basic_json, "cid") -> valuestring;
                printf("城市ID:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "location") -> valuestring;
                printf("县级市:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "parent_city") -> valuestring;
                printf("地级市:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "admin_area") -> valuestring;
                printf("所属省:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "lat") -> valuestring;
                printf("纬度:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "lon") -> valuestring;
                printf("经度:%s\n\n",basic_tmp);
            }
            update_json = cJSON_GetObjectItem(results, "update");
            if(update_json)
            {
                update_tmp = cJSON_GetObjectItem(update_json, "loc") -> valuestring;
                printf("更新时间:%s(所在地时间)\n", update_tmp);
                update_tmp = cJSON_GetObjectItem(update_json, "utc") -> valuestring;
                printf("更新时间:%s(世界时间)\n\n", update_tmp);
            }
            status_tmp = cJSON_GetObjectItem(results, "status") -> valuestring;
            printf("解析状态:%s\n\n", status_tmp);
            daily_json = cJSON_GetObjectItem(results, "daily_forecast");
            if(daily_json)
            {
                for(i = 0; i < 3; i++)
                {
                    forecast_json = cJSON_GetArrayItem(daily_json, i);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "date") -> valuestring;
                    printf("日期:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "cond_txt_d") -> valuestring;
                    printf("白天天气:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "cond_txt_n") -> valuestring;
                    printf("晚上天气:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "tmp_max") -> valuestring;
                    printf("最高温度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "tmp_min") -> valuestring;
                    printf("最低温度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_deg") -> valuestring;
                    printf("风向角度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_dir") -> valuestring;
                    printf("风向:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_sc") -> valuestring;
                    printf("风力:%s\r\n\n", weather_tmp);
                }
            }
        }
    }
    cJSON_Delete(root);
    cJSON_Delete(results);
    cJSON_Delete(basic_json);
    cJSON_Delete(update_json);
    cJSON_Delete(forecast_json);
    cJSON_Delete(daily_json);
}

运行结果:

img_6148efa77ab64a68706e4e001bd64564.jpe

源码下载及实用的API地址:

  • 本项目CodeBlock工程源码下载:MyJSON

  • 在线JSON格式校验工具:bejson

  • 免费的天气api接口:天气API


历史精选文章:


欢迎大家关注我的个人博客

或微信扫码关注我的公众号

img_954cd7422a2def047d3f713ee25a28c1.jpe

目录
相关文章
|
1月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
28天前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
132 12
|
28天前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
39 12
|
2月前
|
JSON JavaScript 前端开发
一次采集JSON解析错误的修复
两段采集来的JSON格式数据存在格式问题,直接使用PHP的`json_decode`会报错。解决思路包括:1) 手动格式化并逐行排查错误;2) 使用PHP-V8JS扩展在JavaScript环境中解析。具体方案一是通过正则表达式和字符串替换修复格式,方案二是利用V8Js引擎执行JS代码并返回JSON字符串,最终实现正确解析。 简介: 两段采集的JSON数据因掺杂JavaScript代码导致PHP解析失败。解决方案包括手动格式化修复和使用PHP-V8JS扩展在JavaScript环境中解析,确保JSON数据能被正确处理。
|
3月前
|
数据采集 JavaScript API
网页解析库:BeautifulSoup与Cheerio的选择
网页解析库:BeautifulSoup与Cheerio的选择
|
3月前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
198 0
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
131 2
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多