既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
设计模式的分类
设计模式如下分为创建型模式,结构型模式,行为型模式。
创建型模式
1、抽象工厂模式(Abstract Factory)
2、建造者模式(Builder)
3、工厂方法模式(Factory Method)
4、原型模式(Prototype)
5、单例模式(Singleton)
结构型模式
1、适配器模式(Adapter)
2、桥接模式(Bridge)
3、组合模式(Composite)
4、装饰者模式(Decorator)
5、外观模式(Facade)
6、享元模式(Flyweight)
7、代理模式(Proxy)、
行为型模式
1、职责链模式(Chain of Responsibility)
2、命令模式(Command)
3、解释器模式(Interpreter)
4、迭代器模式(Iterator)
5、中介者模式(Mediator)
6、备忘录模式(Memento)
7、观察者模式(Observer)
8、状态模式(State)
9、策略模式(Strategy)
10、模板方法模式(Template Method)
11、访问者模式(Visitor)
设计模式的C语言应用-状态机模式-第二章
已剪辑自: https://bbs.huaweicloud.com/blogs/111099
设计模式的C语言应用-状态机模式
模式介绍
有限状态机
状态机示例1
状态机示例2
简单状态机模式实现
普通状态机模式实现
复杂状态机模式实现
模式实现总结
模式介绍
状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一。在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为。
状态用法很多,最常见的是状态机,分为无限状态机和有限状态机。
有限状态机 finite-state machine, FSM, 输入集合和输出集合都是有限的,并只有有限数目的状态。 一般说到状态机即是对有限状态机的简称。
无限状态机 infinite-state machine,ISM ,输入和输出集合无线,状态数目无限的状态机。
在C语言里,状态模式有且仅有一种经典用法,就是有限状态机(FSM)的实现。实现的方式极为突出明显,大部分情况都能直接照搬框架。
状态机最常见的使用场景是实现协议。通常协议会有几个核心状态机描述。
有限状态机
有一个灯,按下开按钮,就会开灯,按下关按钮就会关灯。这就是一个很典型的简单的有限状态机。简单的描述有2个状态,关灯[STATE_OFF],亮[STATE_LIGHT_ON] 。有两个事件,开和关按钮。这两个事件促使状态机间的转换。
有一个灯,按下开按钮,就会开灯,按下关按钮就会关灯。和一般等不同的是,两次开之间的灯的明暗不一样。也就是说,第一次开的时候,是高亮,关灯后,再开是低亮,下次再开是高亮,循环往复。
这就是一个很典型的简单的有限状态机。简单的描述有3个状态,关灯[STATE_OFF],高亮[STATE_HIGH_LIGHT],低亮[STATE_LOW_LIGHT]。
简单状态机模式实现
以状态机示例1为目标,如果用if/switch/case来,就没有什么设计和模式的意义,那只是最普通的流程开发技能。以下是简单状态机模式实现,适用于转移条件单一,对结果很确定的状态机。
#define STATE_OFF 0
#define STATE_LIGHT_ON 1
#define STATE_MAX 2
#define EVETN_BTN_OFF
#define EVETN_BTN_ON
#define EVETN_MAX
int light_fsm_simple_table[STATE_MAX][EVETN_MAX] =
{
[STATE_OFF][EVETN_BTN_OFF] = STATE_OFF,
[STATE_OFF][EVETN_BTN_ON] = STATE_LIGHT_ON,
[STATE_LIGHT_ON][EVETN_BTN_OFF] = STATE_OFF,
[STATE_LIGHT_ON][EVETN_BTN_ON] = STATE_LIGHT_ON
};
int light_fsm_event(int cur_stat, int event)
{
int next_state;
next_state = light_fsm_simple_table[cur_stat][event];
}
int main()
{
int light_state = STATE_OFF;
int eve1 = EVETN_BTN_OFF;
int eve2 = EVETN_BTN_ON;
light_state = light_fsm_event(light_state, eve1);
printf(“now light state is %d\n”, light_state);
light_state = light_fsm_event(light_state, eve2);
printf(“now light state is %d\n”, light_state);
}
以上代码有几个要点
\1. 状态转移数组。由于简单模式某种状态下发生某事件的结果是确定的,所以数组的值就是下一个状态。
\2. 需要一个状态处理的封装函数light_fsm_event。里面除了转移状态,可以增加扩展处理。不然简单模式应用就很局限。比如可以在light_fsm_event里面加入
If(next_state == STATE_LIGHT_ON)
{ printf(“light is on”;}
普通状态机模式实现
大型一点的项目,比如复杂协议的实现,一个状态转移到下一个状态的情况是比较复杂的,无法用当前状态和事件简单确定,所以一般需要函数。
以下代码实现了状态机示例二,为样例代码,未运行实验过。
#define STATE_DEPEND 4
#define STATE_OFF 0
#define STATE_HIGH_LIGHT 1
#define STATE_LOW_LIGHT 2
#define STATE_MAX 3
#define EVETN_BTN_OFF
#define EVETN_BTN_ON
#define EVETN_MAX
int last_state = STATE_LOW_LIGHT;
int last_light_state = STATE_LOW_LIGHT;
struct {
int (*func) ();
int next_state;
} light_fsm [STATE_MAX][EVETN_MAX] =
{
//STATE_OFF
{
{ lfsm_ignore, STATE_MAX }, /EVETN_BTN_OFF/
{ lfsm_btn_on, STATE_DEPEND }, /EVETN_BTN_ON/
}
//STATE_HIGH_LIGHT
{
{ lfsm_btn_off, STATE_OFF }, /EVETN_BTN_OFF/
{ lfsm_ignore, STATE_MAX }, /EVETN_BTN_ON/
}
//STATE_LOW_LIGHT
{
{ lfsm_btn_off, STATE_OFF }, /EVETN_BTN_OFF/
{ lfsm_ignore, STATE_MAX }, /EVETN_BTN_ON/
}
}
int lfsm_ignore(int cur_stat, int event)
{
printf(“invalid state or event\n”);
return 0;
}
int lfsm_btn_on(int cur_stat, int event)
{
if(last_light_state == STATE_HIGH_LIGHT)
{
return STATE_LOW_LIGHT;
}
else if(last_light_state == STATE_LOW_LIGHT)
{
return STATE_HIGH_LIGHT;
}
else
{
printf(“invalid state\n”);
return STATE_MAX;
}
}
int lfsm_btn_off(int cur_stat, int event)
{
last_light_state = cur_stat;
return 0;
}
int light_change_state(int cur_stat, int next_state,int event)
{
//if light on has special handling
if(next_state = STATE_HIGH_LIGHT)
{
printf(“rejoice, now bright light\n”)
};
//other state change related handlings, maybe use current state and next state, or event type
last_state =