C语言-策略模式
1.假设我们需要实现一个排序程序,可以对一个整型数组进行排序。我们需要使用策略模式来封装不同的排序算法,例如冒泡排序、插入排序和快速排序。
2.Code
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
// 策略接口
typedef void (*Strategy)(int*, int);
// 具体策略函数:冒泡排序
void bubbleSortStrategy(int* arr, int n) {
assert(arr);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 具体策略函数:插入排序
void insertionSortStrategy(int* arr, int n) {
assert(arr);
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
// 具体策略函数:快速排序
void quickSort(int* arr, int left, int right) {
assert(arr);
if (left >= right) return;
int pivot = arr[left];
int i = left + 1, j = right;
while (i <= j) {
while (i <= j && arr[i] < pivot) i++;
while (i <= j && arr[j] > pivot) j--;
if (i <= j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
int temp = arr[left];
arr[left] = arr[j];
arr[j] = temp;
quickSort(arr, left, j - 1);
quickSort(arr, j + 1, right);
}
void quickSortStrategy(int* arr, int n) {
assert(arr);
quickSort(arr, 0, n - 1);
}
// 上下文类
typedef struct {
Strategy strategy;
} Context;
// 执行策略
void executeStrategy(Context* context, int* arr, int n) {
assert(arr);
assert(context);
if (context->strategy) {
context->strategy(arr, n);
}
}
//打印排序好的数据
void print_after_sort(int *arr, int arr_len)
{
assert(arr);
for (int i = 0; i < arr_len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
// 创建具体策略函数
Strategy bubbleSort = bubbleSortStrategy;
Strategy insertionSort = insertionSortStrategy;
Strategy quickSort = quickSortStrategy;
int arr_1[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
int arr_2[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
int arr_3[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
int arr_len = sizeof(arr_1) / sizeof(arr_1[0]);
// 创建上下文对象,并使用具体策略函数:冒泡排序
Context context = {bubbleSort};
executeStrategy(&context, arr_1, arr_len);
print_after_sort(arr_1, arr_len);
// 切换策略为具体策略函数:插入排序
context.strategy = insertionSort;
executeStrategy(&context, arr_2, arr_len);
print_after_sort(arr_2, arr_len);
// 切换策略为具体策略函数:快速排序
context.strategy = quickSort;
executeStrategy(&context, arr_3, arr_len);
print_after_sort(arr_3, arr_len);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通