c语言模板程序,模板模式 (C语言实现)
一. 問題
在面向對象系統的分析與設計過程中經常會遇到這樣一種情況:對于某一個業務邏輯(算法實現)在不同的對象中有不同的細節實現,但是邏輯(算法)的框架(或通用的應用算法)是相同的。Template提供了這種情況的一個實現框架。
二. 模式
Template 模式是采用繼承的方式實現這一點:將邏輯(算法)框架放在抽象基類中,并定義好細節的接口,子類中實現細節。
三. 代碼
abstractClass.h
#ifndef ABSTRACTCLASS_H
#define ABSTRACTCLASS_H
#include
#include
typedef struct {
size_t size;
void* (*ctor)(void *_self, va_list *params);
void* (*dtor)(void *_self);
void (*templateMethod)(const void *_self);
char *description;
} AbstractClass;
#endif
concreteClass1.h
#ifndef CONCRETECLASS1_H
#define CONCRETECLASS1_H
#include "abstractClass.h"
typedef struct {
const void *abstractClass;
void (*primitiveOperation1)(const void *_self);
void (*primitiveOperation2)(const void *_self);
int a;
} _ConcreteClass1;
extern const void *ConcreteClass1;
#endif
concreteClass1.c
#include "concreteClass1.h"
#include
#include
#include
#include
#include
static void *concreteClass1Ctor(void *_self, va_list *params) {
_ConcreteClass1 *self = _self;
const char *description = va_arg(*params, const char *);
(*(AbstractClass **)self)->description = calloc(1, strlen(description) + 1);
assert((*(AbstractClass **)self)->description);
strncpy((*(AbstractClass **)self)->description, description, strlen(description) + 1);
self->a = va_arg(*params, int);
return self;
}
static void *concreteClass1Dtor(void *_self) {
_ConcreteClass1 *self = _self;
if (NULL != (*(AbstractClass **)self)->description) {
free((*(AbstractClass **)self)->description);
(*(AbstractClass **)self)->description = NULL;
}
self->a = 0;
return self;
}
static void concreteClass1PrimitiveOperation1(const void *_self) {
if (NULL != (*(const AbstractClass * const *)_self)->description) {
fprintf(stdout, "%s\n", (*(const AbstractClass * const *)_self)->description);
}
}
static void concreteClass1PrimitiveOperation2(const void *_self) {
const _ConcreteClass1 *self = _self;
fprintf(stdout, "%d\n", self->a);
}
static void concreteClass1TemplateMethod(const void* _self) {
concreteClass1PrimitiveOperation1(_self);
concreteClass1PrimitiveOperation2(_self);
}
static AbstractClass _concreteClass1 = {
sizeof(_ConcreteClass1),
concreteClass1Ctor,
concreteClass1Dtor,
concreteClass1TemplateMethod,
NULL
};
const void *ConcreteClass1 = &_concreteClass1;
concreteClass2.h
#ifndef CONCRETECLASS2_H
#define CONCRETECLASS2_H
#include "abstractClass.h"
typedef struct {
const void *abstractClass;
void (*primitiveOperation1)(const void *_self);
void (*primitiveOperation2)(const void *_self);
double b;
} _ConcreteClass2;
extern const void *ConcreteClass2;
#endif
concreteClass2.c
#include "concreteClass2.h"
#include
#include
#include
#include
#include
static void *concreteClass2Ctor(void *_self, va_list *params) {
_ConcreteClass2 *self = _self;
const char *description = va_arg(*params, const char *);
(*(AbstractClass **)self)->description = calloc(1, strlen(description) + 1);
assert((*(AbstractClass **)self)->description);
strncpy((*(AbstractClass **)self)->description, description, strlen(description) + 1);
self->b = va_arg(*params, double);
return self;
}
static void *concreteClass2Dtor(void *_self) {
_ConcreteClass2 *self = _self;
if (NULL != (*(AbstractClass **)self)->description) {
free((*(AbstractClass **)self)->description);
(*(AbstractClass **)self)->description = NULL;
}
self->b = 0;
return self;
}
static void concreteClass2PrimitiveOperation1(const void *_self) {
if (NULL != (*(const AbstractClass * const *)_self)->description) {
fprintf(stdout, "%s\n", (*(const AbstractClass **)_self)->description);
}
}
static void concreteClass2PrimitiveOperation2(const void *_self) {
const _ConcreteClass2 *self = _self;
fprintf(stdout, "%f\n", self->b);
}
static void concreteClass2TemplateMethod(const void* _self) {
concreteClass2PrimitiveOperation1(_self);
concreteClass2PrimitiveOperation2(_self);
}
static AbstractClass _concreteClass2 = {
sizeof(_ConcreteClass2),
concreteClass2Ctor,
concreteClass2Dtor,
concreteClass2TemplateMethod,
NULL
};
const void *ConcreteClass2 = &_concreteClass2;
new.h
#ifndef __NEW_H__
#define __NEW_H__
void *New(const void *_class, ...);
void Delete(void *_class);
void TemplateMethod(const void *_class);
#endif
new.c
#include "new.h"
#include "abstractClass.h"
#include
#include
#include
#include
void *New(const void *_class, ...) {
const AbstractClass *class = _class;
void *p = calloc(1, class->size);
assert(p);
*(const AbstractClass **)p = class;
if (class->ctor) {
va_list params;
va_start(params, _class);
p = class->ctor(p, ?ms);
va_end(params);
}
return p;
}
void Delete(void *_class) {
const AbstractClass **class = _class;
if (_class && *class && (*class)->dtor) {
_class = (*class)->dtor(_class);
}
free(_class);
}
void TemplateMethod(const void *_class) {
const AbstractClass * const *class = _class;
if (_class && *class && (*class)->templateMethod) {
(*class)->templateMethod(_class);
}
}
main.c
#include "new.h"
#include "concreteClass1.h"
#include "concreteClass2.h"
int main(int argc, char *argv[]) {
void *p1 = New(ConcreteClass1, "ConcreteClass1", 10);
void *p2 = New(ConcreteClass2, "ConcreteClass2", 20.1);
TemplateMethod(p1);
TemplateMethod(p2);
Delete(p1);
Delete(p2);
return 0;
}
圖片來源:http://blog.csdn.net/hmsiwtv/article/details/9627019
總結
以上是生活随笔為你收集整理的c语言模板程序,模板模式 (C语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言程序设计对称字符串,C语言程序设计
- 下一篇: c语言电子期末考试题,山东师范大学11-