c语言 state,state 模式 C语言实现

场景:23类设计模式 之 State模式(状态模式)[C语言实现] 3/23

23种设计模式 之 State模式(状态模式)[C语言实现] 3/23

一、概念定义

State模式:允许一个对象在其状态发生改变时,改变它的行为。

State模式和Strategy模式非常相似,需要说明的是两者的思想是一致的;只不过封装的对象不同:State模式封装的是不同的状态,而Strategy模式封装的是不同的算法。

State模式主要解决的问题是:在开发过程中,时常遇到需要根据不同的状态需要进行不同的处理操作的问题。大部分人采用的是switch-case语句进行处理的,这样会造成分支过多。State模式采用了对这些不同状态进行封装的方式处理这类问题,当状态发生变化时进行处理,再切换至另外一种状态,也就是说将状态切换的任务交给了状态类去负责。

二、模式结构图

095929212.jpg

图1 State模式结构图

三、场景设计

人的一生需经历:婴儿、青少年、中年、老年这几个阶段(状态),每个阶段对应的行为:婴儿->喝奶青少年->学习   中年->工作老年->退休。请用程序模拟这个过程的变化。

四、C语言实现

// 结构体定义

// 人生状态

typedef enum

{

PSTATE_BABY, // 婴儿

PSTATE_YOUNG, // 青少年

PSTATE_MIDDLE, // 中年

PSTATE_OLD, // 老年

PSTATE_TOTAL // 状态个数

}person_state_e;// 人类:结构体

typedef struct

{

...

int (*action)(void); // 状态对应的行为

...

}person_t;

// 状态对应的行为

// 婴儿状态:喝奶, etc.

int drink(void)

{

fprintf(stdout, "I am drinking milk!");

return 0;

}

...// 青少年状态:学习, etc.

int study(void)

{

fprintf(stdout, "I am study!");

return 0;

}

...// 中年状态:工作, etc.

int work(void)

{

fprintf(stdout, "I am working!");

return 0;

}

...// 老年状态:退休, etc.

int retire(void)

{

fprintf(stdout, "I am have been retired!");

return 0;

}

...

// 状态切换模块

// 状态切换

int setstate(person_state_e state, person_t *person)

{

switch(state)

{

case PSTATE_BABY:

{

...

person.action = drink;

...

break;

}

case PSTATE_YOUNG:

{

...

person.action = study;

...

break;

}

case PSTATE_MIDDLE:

{

...

person.action = work;

...

break;

}

case PSTATE_OLD:

{

...

person.action = retrie;

...

break;

}

default:

{

return -1;

}

}

return 0;

}

// State模式的使用

int main(int argc, const char *argv[])

{

person_t person;

memset(person, 0, sizeof(person));

setstate(PSTATE_BABY, &person);

person.action();

...

setstate(PSTATE_YOUNG, &person);

person.action();

...

setstate(PSTATE_MIDDLE, &person);

person.action();

...

setstate(PSTATE_OLD, &person);

person.action();

...

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值