C语言责任链模式示例代码

C语言责任链模式是一种行为设计模式,它将请求的发送和接收方解耦,使得多个对象均有机会处理请求。责任链模式的主要思想是,将多个对象链接在一起,由对象之间组成一条链,依次处理请求。

下面是一个C语言责任链模式的示例代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct node node_t;

struct node
{
    int value;
    node_t *next;
};

void print(node_t *node)
{
    while (node != NULL)
    {
        printf("%d ", node->value);
        node = node->next;
    }
    printf("\n");
}

void add(node_t **node, int value)
{
    node_t *new_node = malloc(sizeof(node_t));
    new_node->value = value;
    new_node->next = *node;
    *node = new_node;
}

void remove_node(node_t **node, int value)
{
    node_t *previous_node = NULL;
    node_t *current_node = *node;

    while (current_node != NULL)
    {
        if (current_node->value == value)
        {
            if (previous_node == NULL)
            {
                *node = current_node->next;
            }
            else
            {
                previous_node->next = current_node->next;
            }

            free(current_node);
            break;
        }

        previous_node = current_node;
        current_node = current_node->next;
    }
}

void destroy(node_t *node)
{
    node_t *tmp = NULL;

    while (node != NULL)
    {
        tmp = node;
        node = node->next;
        free(tmp);
    }
}

int main()
{
    node_t *list = NULL;
    add(&list, 3);
    add(&list, 2);
    add(&list, 1);
    add(&list, 0);

    print(list);

    remove_node(&list, 2);

    print(list);

    destroy(list);

    return 0;
}

以上代码的主要思想是打印、添加和删除节点,链表可以链式调用方法以完成以上三个任务。

以下是一个使用责任链模式的示例,它演示了如何使用责任链模式实现一个简单的身份验证流程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_USERNAME_LENGTH 20
#define MAX_PASSWORD_LENGTH 20

typedef struct user user_t;
typedef struct authenticator authenticator_t;

struct user
{
    char username[MAX_USERNAME_LENGTH];
    char password[MAX_PASSWORD_LENGTH];
};

struct authenticator
{
    authenticator_t *next;
    void (*handle_authentication)(user_t *);
};

void username_authentication(user_t *user)
{
    printf("Username authentication...\n");
}

void password_authentication(user_t *user)
{
    printf("Password authentication...\n");
}

void authentication(user_t *user, authenticator_t *authenticator)
{
    if (authenticator == NULL)
    {
        printf("Authentication success!\n");
        return;
    }

    authenticator->handle_authentication(user);
    authentication(user, authenticator->next);
}

int main()
{
    authenticator_t authenticator1 = {NULL, username_authentication};
    authenticator_t authenticator2 = {&authenticator1, password_authentication};

    user_t user = {"username", "password"};

    authentication(&user, &authenticator2);

    return 0;
}

以上代码定义了一个用户结构体和一个身份认证器结构体。身份认证器结构体包含一个指向下一个身份认证器的指针和一个处理身份验证的函数指针。authentication函数使用责任链模式调用身份认证器链表上的所有身份认证器。如果所有身份认证器都通过了验证,则认证成功。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言责任链模式示例代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • C 程序 八进制转换为二进制

    让我来为您详细介绍C程序如何将八进制转换为二进制。 1. 简介 如何将八进制转换为二进制这个问题,实际上是一个将任意进制的数转换为另一种进制的问题,只不过这里以八进制和二进制转换为例子来说明。要将八进制数转换为二进制,我们需要将八进制数的每一位先转换为二进制,再将每个二进制数位连接起来,最终得到二进制数。 2. 具体步骤 具体的转换步骤如下: 将每个八进制位…

    C 2023年5月9日
    00
  • MathWorks MATLAB R2020b详细密钥安装教程(附许可下载)

    MathWorks MATLAB R2020b详细密钥安装教程(附许可下载) 简介 MathWorks MATLAB R2020b是一款流行的科学计算软件,广泛用于工程、科学和数学领域。为了使用MATLAB软件,需要先安装软件并激活许可证。 本篇文章将提供详细的步骤来完成MathWorks MATLAB R2020b的安装和许可证激活过程。此外,我们还会提供…

    C 2023年5月22日
    00
  • 一文带你搞懂C语言预处理宏定义

    一文带你搞懂C语言预处理宏定义 什么是预处理宏定义 预处理宏定义是用宏定义指令将某个字符序列映射为另一个字符序列的编程技巧。在源代码编译之前,编译器会通过一个预处理器扫描源代码文件,将其中预处理宏定义的字符序列全部替换为对应的字符序列,这个过程称为宏展开。 预处理宏定义可以用来避免大量重复输入代码,增加代码的可维护性和可读性,同时也可以定义一些通用的常量或者…

    C 2023年5月23日
    00
  • C 程序 小写字符串转换为大写字符串

    下面是关于”C程序小写字符串转换为大写字符串”的完整使用攻略。 标题 在文档中,必须标明标题,这样可以很明确地表明当前章节的内容。 C程序小写字符串转换为大写字符串 这是主题的标题,表明了我们要解决的问题。 概述 在讲解使用攻略之前,我们需要了解一下程序的功能和原理。 本程序的主要功能是将小写字符串转换为大写字符串。程序主要利用了C语言标准库中的ctype.…

    C 2023年5月9日
    00
  • JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】

    下面是“JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】” 的完整攻略: 1. 什么是JSON数组? JSON是JavaScript Object Notation的简称,是一种数据交换格式,常用于网络传输和存储数据。JSON数组则是一种由多个JSON对象组成的数据结构,每个对象之间以逗号分隔,整体用方括号包裹。 示例: [ { "n…

    C 2023年5月23日
    00
  • python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案

    Python对任意数据和曲线进行拟合并求出函数表达式有以下三种常见的解决方案: 多项式拟合: 多项式拟合是一种最简单的拟合方法,其实现思路是在已有的数据点上,通过构建一个多项式,来逼近已知的函数。在Python中,使用numpy库中的polyfit函数来实现多项式拟合。具体步骤如下: import numpy as np import matplotlib.…

    C 2023年5月22日
    00
  • C语言 以字符形式读写文件详解及示例代码

    C语言 以字符形式读写文件详解及示例代码 文件操作是C语言中必不可少的一部分,在我们的编程过程中,常常需要读取文件或将数据写入文件,本文将详细讲解以字符形式读写文件的方法及示例代码。 文件输入输出流 在C语言中,对文件的输入输出操作都是通过文件流(file stream)实现的。文件流是一种数据流,它代表了一个文件,通过文件流,我们可以将数据从文件中读取,也…

    C 2023年5月24日
    00
  • C++ vector如何动态申请内存的元素

    C++ vector是一个动态数组容器。它会在内存中申请一段连续的空间,用于存放元素,当需要插入新元素时,vector会判断当前容量是否满足要求,如果不满足,就会自动申请一段更大的空间,并将原有元素复制到新空间中。下面是C++ vector如何动态申请内存的元素的完整攻略: 申请动态内存 当需要存储一组大小未知的数据时,可以使用vector。vector支持…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部