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日

相关文章

  • JVM指令的使用深入详解

    JVM指令的使用深入详解 Java虚拟机是Java语言的运行环境,负责执行Java应用程序并提供运行时环境。Java虚拟机具有跨平台性、安全性、动态性、扩展性等优势,是Java程序能够跨平台运行的重要保障。Java虚拟机执行Java应用程序时使用的是Java字节码,Java字节码使用类似汇编语言的JVM指令进行描述。Java虚拟机的JVM指令提供了丰富的操作…

    C 2023年5月22日
    00
  • C++11/14 线程调用类对象和线程传参的方法

    C++11/14 引入了 std::thread 类和一些线程库支持,可以方便地支持在 C++11/14 中创建线程。当需要在线程内调用类的对象或传递参数时,有几种方法可以实现。 调用类对象 使用成员函数 C++11/14 允许我们使用 lambda 表达式在一个新线程中调用一个类的某个成员函数。我们需要捕获类对象的引用,例如: class MyClass …

    C 2023年5月22日
    00
  • C语言实现餐厅点餐系统

    C语言实现餐厅点餐系统 1. 概述 餐厅点餐系统是一种常见的实用型软件系统。本文将讲解如何使用C语言实现一个基本的餐厅点餐系统,让读者全面掌握对C语言的应用和理解。 2. 系统功能划分 餐厅点餐系统需要完成以下功能: 清单功能:展示所有菜单清单的名称和价格。 下单功能:让用户输入要购买的菜单名称,并记录用户所选的菜单。 结账功能:展示用户所选的所有菜单清单,…

    C 2023年5月23日
    00
  • 浅谈Spring @Async异步线程池用法总结

    针对“浅谈Spring @Async异步线程池用法总结”的主题,我将详细讲解如下: 1. 什么是Spring @Async异步线程池 在介绍 Spring @Async 异步线程池之前,我们需要先了解同步和异步的概念: 同步:就是一个任务执行完之后再执行下一个任务,任务按顺序一个接一个依次执行。 异步:与同步相反,异步任务的执行时间和顺序是不可预测的,任务的…

    C 2023年5月23日
    00
  • C语言中栈的两种实现方法

    C语言中栈是一种常用的数据结构,常用于程序中的内存管理、函数调用等场景。在C语言中,栈的实现方法主要有两种:数组实现和链表实现。 数组实现 数组实现是一种简单、直接、易于理解和操作的方式。栈的数组实现要求开辟一段连续的内存空间,容量为栈的最大大小,在程序运行时空间大小固定,但在使用时效率高,适合空间比较紧张的场景。 下面是一个数组实现的栈结构的示意代码: #…

    C 2023年5月23日
    00
  • 详解如何将c语言文件打包成exe可执行程序

    下面详细讲解如何将C语言文件打包成可执行程序。 1. 编写C语言代码 首先,需要编写C语言代码,比如我们可以写一个非常简单的“Hello World”程序,代码如下: #include <stdio.h> int main() { printf("Hello World!\n"); return 0; } 把以上程序保存为ma…

    C 2023年5月23日
    00
  • c++ base64编解码使用示例

    C++ Base64编解码使用示例 简介 Base64是一种编码方式,能够将二进制数据转化为可打印的ASCII字符,常用于邮件、XML等文本转移过程中对二进制数据进行编码。C++也提供了Base64编解码的支持,这里就进行一下说明。 Base64编码 Base64编码将三个8位的字节转换为四个6位的字节,即每3个字节将会变成4个字节,更准确的说是每满4个字节…

    C 2023年5月30日
    00
  • C语言实现宿舍管理系统

    C语言实现宿舍管理系统攻略 1. 项目简介 “C语言实现宿舍管理系统”是一项用C语言构建的宿舍管理系统项目,旨在帮助学校有效管理并提高学生宿舍管理效率。该项目运用了C语言的基本语法和数据结构设计,具备良好的可扩展性和可维护性,适合初学C语言的学生或开发人员参考和学习。 2. 项目功能模块 该宿舍管理系统主要涉及以下几个模块: 登录模块:系统管理员或学生通过输…

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