#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Interface_t
{
/*初始化外设USB、SPI、IIC等*/
void (*init_peripheral)(void *obj);
/*初始化硬盘*/
void (*init_disk)(void* obj);
/*初始化内存*/
void (*init_memory)(void* obj);
/*初始化网络*/
void (*init_net)(void *obj);
/*对整个流程初始化*/
void (*init)(void *obj);
}Interface_t;
// 这里定义的是AMD,也可以复制一份改成Interl
typedef struct AMDCpuStart_t
{
void (*init_peripheral)(void *obj); //初始化外设
void (*init_disk)(void* obj); //初始化硬盘
void (*init_memory)(void* obj); //初始化内存
void (*init_net)(void *obj); //初始化网络
void (*init)(void *obj); //模块 整个初始化流程
}AMDCpuStart_t;
static void ADM_init_peripheral(void *obj)
{
printf("初始化AMD 外设...\n");
}
static void ADM_init_disk(void *obj)
{
printf("初始化AMD 硬盘...\n");
}
static void ADM_init_memory(void *obj)
{
printf("初始化AMD 内存...\n");
}
static void ADM_init_net(void *obj)
{
printf("初始化AMD 网络...\n");
}
//初始化模板
static void ADM_init(void *obj)
{
AMDCpuStart_t *amd = (AMDCpuStart_t*)obj;
printf("AMD CPU 上电初始化流程: \n");
amd->init_peripheral(amd);
amd->init_disk(amd);
amd->init_memory(amd);
amd->init_net(amd);
}
//AMD构造函数 创建一个结构体指针
AMDCpuStart_t* construct_amd_cpu(void)
{
AMDCpuStart_t* obj = (AMDCpuStart_t*)malloc(sizeof(AMDCpuStart_t));
obj->init = ADM_init;
obj->init_disk = ADM_init_disk;
obj->init_memory = ADM_init_memory;
obj->init_net = ADM_init_net;
obj->init_peripheral = ADM_init_peripheral;
return obj;
}
//二次重写 AMD 外设初始化程序
void ADM_init_peripheral_v1(void *obj)
{
printf("新接口: 初始化 ADM 的外设: USB3.0、SPI、IIC接口...\n");
}
//二次重写 AMD 硬盘初始化程序
void ADM_init_disk_V1(void *obj)
{
printf("新接口: 初始化AMD 硬盘: 三星固态硬盘(512G)、东芝固态硬盘(128G)...\n");
}
int main(int argc, char *argv[])
{
Interface_t *cpu=NULL;
//创建一个AMD对象
cpu = (Interface_t*)construct_amd_cpu();
//调用模板 初始化AMD CPU
cpu->init(cpu);
printf("\n二次重写的硬盘和外设初始化接口:\n");
//给函数指针二次赋值(等于重写),便于修改添加新概念
cpu->init_peripheral = ADM_init_peripheral_v1;
//给函数指针二次赋值(等于重写),便于修改添加新概念
cpu->init_disk = ADM_init_disk_V1;
//调用模块,修改了初始化硬盘、初始化外设接口
cpu->init(cpu);
free(cpu);
cpu = NULL;
return 0;
}
标签:初始化,ADM,obj,模版,void,AMD,init,设计模式,DP
From: https://www.cnblogs.com/starcos/p/18101873