状态机模式(c语言版设计模式)

设计模式-状态机-c语言

前言
只用逻辑来编程可能导致代码比较难维护。时常看别人写的代码以及自己以前写的代码,发现逻辑是比较清晰但是健壮性还是不足,想要修改优化增加新的代码反而比较费劲,重新写可能比在原来代码上修改可能要来得直接。为什么会出现这样的情况?我想首要的原因是,在编程时只顾着实现逻辑,而忘了思考如何让代码更易于维护。
状态机-顾名思义,讲的是如何方便得更改某个实体状态的模型,简单得说就是有1byte(1bit)甚至更大的全局数据,通过封装一系列操作接口改变成需求的状态。

普通型状态机
通过数组转换可以改变当前的状态。这种普通模型需要实现定义好全部的状态,比如电灯泡的开关,只有开和关两种状态就有4种组合:
状态机模式(c语言版设计模式)_第1张图片
u8 status[2][2] = {0,1,0,1} ;
例:
当前状态为开(1),更改状态为关(0)–>status[1][0] = 0 (关)
当前状态为关(0),更改状态为开(1)–>status[0][1] = 1 (开)

以此类推n种状态有status[n][n]种状态变化组合,视情况而定。

普通型的状态机模型设计上比较容易,效率也非常高,只是一步数组取值就可以变更状态。但是维护性上来说当然是有其局限性,不能通过增加操作接口增加新的状态,状态的迁移已经在数组中定好,需要更改数组。

进阶型状态机
上一个普通型状态机是比较普遍的状态机,应用于C编写的程序中,普遍情况下,状态的变迁是有限的并且可知。那么进阶型的状态机是C实现的OOP封装,通过封装一个通用的方法,定义动态的多组操作函数,一组全局变量。这个组合就可以进行状态的任意切换及添加,灵活性非常强。

现在将普通型的电灯改装成按键,关-开(低亮)-开(高亮)-关模型。

#include 
void close();
void openLow();
void openHight();

//自定义类型
typedef struct changeOp{
	//此处可以有多个接口表示有多个按键
	void (*operate)();
}sChange;

//全局操作,可以认为是记录了下一次操作(按一次开关)
sChange nextOp;

//关闭
void close()
{
	printf("状态迁移至关!\n");
	nextOp.operate = openLow;
}
//低亮
void openLow()
{
	printf("状态迁移至低亮!\n");
	nextOp.operate = openHight;
}
//高亮
void openHight()
{
	printf("状态迁移至高亮!\n");
	nextOp.operate = close;
}

//初始状态
void initial()
{
	printf("初始状态为关!\n");
	nextOp.operate = openLow;
}

void main(void)
{
	 initial();
	 nextOp.operate();//低亮
	 nextOp.operate();//高亮
	 nextOp.operate();//关闭
	 nextOp.operate();//低亮
	
	return;
}

状态机模式(c语言版设计模式)_第2张图片

代码已在在线工具验证,可以灵活使用,模型大概的步骤如上所示,具体情况采用具体的设计。

你可能感兴趣的:(设计模式,设计模式)