|
| 出处:21ic 时间: 2007-08-24 |
|
mymcudream 发布于 2007-8-23 15:04:00 突然想做做一些嵌入式设计模式方面的小例子,希望大家多抛砖头!
模式一:state 应用范围:一些带有状态转换的工业控制软件中,如洗衣机,门禁 代码示例: enum STATE { LOCK_STATE = 0, UNLOCK_STATE = 1, };
enum EVENT_CODE { KEY = 0, OUT = 1, };
void Lock_Unlock_Change_Func(void) { printf("Lock to unlock state.\n"); }
void UnLock_lock_Change_Func(void) { printf("UnLock to lock state.\n"); }
struct STATE_EVENT { int curstate; int eventcode; int nextstate; void (*changefunc)(void); };
struct STATE_EVENT state_table[] = { {LOCK_STATE, KEY, UNLOCK_STATE, Lock_Unlock_Change_Func}, {UNLOCK_STATE, OUT, LOCK_STATE, UnLock_lock_Change_Func}, };
static int currentstate = LOCK_STATE;
void State_Engine(int event) { int i;
for (i = 0; i < 2; i++) { if (currentstate == state_table[i].curstate && event == state_table[i].eventcode) { currentstate = state_table[i].nextstate; state_table[i].changefunc(); return; } } printf("Aother thing happend\n"); }
int main(int argc, char* argv[]) {
State_Engine(KEY); State_Engine(OUT); State_Engine(OUT); return 0; }
yan2005 发布于 2007-8-24 12:36:00 在视频通信的过程中,通话的两方的拨号\通话\挂机等状态的转换当时也是用这种状态机模型来做的。
mymcudream 发布于 2007-8-24 14:15:00 ,有空多交流. 其实我一直在想,嵌入式软件中能不能使用设计模式.
mymcudream 发布于 2007-8-24 14:17:00 struct observer { void (*update)(void); };
struct subject { struct observer *observers[4];
void (*addobserver)(struct subject *subject, struct observer *observer); void (*notify)(struct subject *subject); };
void Subject_AddObserver(struct subject *subject, struct observer *observer) { static int count = 0; if (count > 4) { return ; }
subject->observers[count++] = observer; }
void Subject_Notify(struct subject *subject) { int i;
printf("Subject Notify Thing\n"); for (i = 0; i < 4; i++) { subject->observers[i]->update(); } }
void Subject_Construct(struct subject *subject) { subject->addobserver = Subject_AddObserver; subject->notify = Subject_Notify ; }
void ObserverA_Update(void) { printf("Observer A Update\n"); }
void ObserverB_Update(void) { printf("Observer B Update\n"); }
void ObserverC_Update(void) { printf("Observer C Update\n"); }
void ObserverD_Update(void) { printf("Observer D Update\n"); }
void Observer_Construct(struct observer *observer, void (*update)(void)) { observer->update = update; }
int main(int argc, char* argv[]) { struct observer observera; struct observer observerb; struct observer observerc; struct observer observerd;
struct subject subject;
Observer_Construct(&observera, ObserverA_Update); Observer_Construct(&observerb, ObserverB_Update); Observer_Construct(&observerc, ObserverC_Update); Observer_Construct(&observerd, ObserverD_Update);
Subject_Construct(&subject);
subject.addobserver(&subject, &observera); subject.addobserver(&subject, &observerb); subject.addobserver(&subject, &observerc); subject.addobserver(&subject, &observerd);
subject.notify(&subject);
return 0; }
ketp 发布于 2007-8-24 21:23:00 代码写得不怎么样,只是为了使用模式而用模式。
|
| 【关闭】 【打印】 |
|
|
|
|