函数指针架构
- 设计思路:定义一个函数指针类型,用于指向不同图形的绘制函数。创建一个数组,数组元素为该函数指针类型,每个元素对应一种图形的绘制函数。当需要添加新图形类型时,在数组中添加相应的函数指针,并实现对应的绘制函数。调用绘制函数时,通过数组索引来调用相应的函数指针。
- 示例代码(C语言):
#include <stdio.h>
// 定义绘制圆形的函数
void drawCircle() {
printf("Drawing a circle.\n");
}
// 定义绘制矩形的函数
void drawRectangle() {
printf("Drawing a rectangle.\n");
}
// 定义函数指针类型
typedef void (*DrawFunction)();
int main() {
// 创建函数指针数组
DrawFunction drawFunctions[2];
drawFunctions[0] = drawCircle;
drawFunctions[1] = drawRectangle;
// 调用绘制函数
drawFunctions[0]();
drawFunctions[1]();
return 0;
}
- 优点:
- 简单直观:实现方式较为直接,易于理解和维护。
- 高效调用:通过数组索引直接调用函数指针,效率较高。
- 缺点:
- 扩展性有限:添加新图形类型时,需要手动修改数组大小并添加相应的函数指针,不够灵活。
- 缺乏类型安全:函数指针本身不具备类型检查,可能导致调用错误的函数。
指针函数架构
- 设计思路:定义一个指针函数,该函数返回一个指向具体绘制函数的指针。在函数内部,可以根据传入的参数(如图形类型标识)来返回不同的绘制函数指针。调用绘制函数时,先调用指针函数获取具体的绘制函数指针,再调用该指针。添加新图形类型时,在指针函数中添加相应的逻辑来返回新图形的绘制函数指针。
- 示例代码(C语言):
#include <stdio.h>
// 定义绘制圆形的函数
void drawCircle() {
printf("Drawing a circle.\n");
}
// 定义绘制矩形的函数
void drawRectangle() {
printf("Drawing a rectangle.\n");
}
// 定义指针函数
typedef void (*DrawFunction)();
DrawFunction getDrawFunction(int shapeType) {
if (shapeType == 0) {
return drawCircle;
} else if (shapeType == 1) {
return drawRectangle;
}
return NULL;
}
int main() {
// 获取绘制圆形的函数指针并调用
DrawFunction circleFunction = getDrawFunction(0);
if (circleFunction) {
circleFunction();
}
// 获取绘制矩形的函数指针并调用
DrawFunction rectangleFunction = getDrawFunction(1);
if (rectangleFunction) {
rectangleFunction();
}
return 0;
}
- 优点:
- 扩展性较好:添加新图形类型时,只需在指针函数中添加新的逻辑,不需要修改数组等数据结构,更灵活。
- 类型安全相对提高:可以在指针函数中添加一些类型检查逻辑,提高安全性。
- 缺点:
- 调用效率稍低:每次调用绘制函数都需要先调用指针函数获取指针,增加了一层函数调用开销。
- 代码复杂度增加:指针函数内部逻辑可能会随着图形类型的增加而变得复杂,增加了维护难度。