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