MST
星途 面试题库

面试题:C语言中函数指针在设计模式中的应用

请结合C语言中的函数指针,阐述其在策略模式或观察者模式等设计模式中的应用。要求给出具体的代码示例,说明如何通过函数指针实现不同行为的切换,以及如何实现对象间的解耦和事件通知机制。
36.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

1. 策略模式

策略模式定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。函数指针在策略模式中可用于实现不同算法的切换。

#include <stdio.h>

// 定义策略函数类型
typedef void (*StrategyFunction)(int);

// 具体策略1
void strategy1(int data) {
    printf("执行策略1,处理数据: %d\n", data);
}

// 具体策略2
void strategy2(int data) {
    printf("执行策略2,处理数据: %d\n", data);
}

// 上下文结构体
typedef struct {
    StrategyFunction strategy;
} Context;

// 设置策略
void setStrategy(Context *context, StrategyFunction func) {
    context->strategy = func;
}

// 执行策略
void executeStrategy(Context *context, int data) {
    if (context->strategy) {
        context->strategy(data);
    }
}

int main() {
    Context context;
    setStrategy(&context, strategy1);
    executeStrategy(&context, 10);

    setStrategy(&context, strategy2);
    executeStrategy(&context, 20);

    return 0;
}

2. 观察者模式

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

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

// 定义观察者函数类型
typedef void (*ObserverFunction)(int);

// 观察者结构体
typedef struct Observer {
    ObserverFunction func;
    struct Observer *next;
} Observer;

// 主题结构体
typedef struct {
    Observer *head;
    int data;
} Subject;

// 添加观察者
void attach(Subject *subject, ObserverFunction func) {
    Observer *newObserver = (Observer *)malloc(sizeof(Observer));
    newObserver->func = func;
    newObserver->next = subject->head;
    subject->head = newObserver;
}

// 通知所有观察者
void notify(Subject *subject) {
    Observer *current = subject->head;
    while (current) {
        current->func(subject->data);
        current = current->next;
    }
}

// 具体观察者1
void observer1(int data) {
    printf("观察者1收到通知,数据: %d\n", data);
}

// 具体观察者2
void observer2(int data) {
    printf("观察者2收到通知,数据: %d\n", data);
}

int main() {
    Subject subject;
    subject.head = NULL;
    subject.data = 0;

    attach(&subject, observer1);
    attach(&subject, observer2);

    subject.data = 10;
    notify(&subject);

    return 0;
}

3. 总结

  • 策略模式:通过函数指针,在上下文对象中封装不同的行为函数,使得在运行时可以动态切换行为,实现了算法与使用算法的代码的解耦。
  • 观察者模式:利用函数指针来定义观察者的响应函数,主题对象通过维护观察者链表,在状态改变时调用观察者的函数指针来实现事件通知,从而解耦了主题和观察者对象,使得它们可以独立变化。