設計模式DP-模版模式

starc再起航發表於2024-03-28
#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;
}
  • ()[https://zhuanlan.zhihu.com/p/636315448]

相關文章