我是老温,一名热爱学习的嵌入式工程师
关注我,一起变得更加优秀!
1 - 什么是设计模式?
关于设计模式的概念,在网络上只需要搜索“什么是设计模式?”,就会有不少关于设计模式的概念介绍。
通俗地概括,设计模式就是一套写代码方面的最佳实践经验总结,这些经验总结已经被很多软件工程师知晓,并且在实际项目中反复验证。
设计模式起源于1994年,最初由4位外国的软件工程师(Gang of Four,简称GOF)提出,他们提出可复用的面向对象软件元素---设计模式,是基于以下两点原则进行设计的:
1-对接口编程而非对实现编程。
2-优先使用对象组合而不是继承。
GOF一共提出了23种设计模式,这些设计模式可以分为三个大类:创建型模式、结构型模式、行为型模式。
创建型模式:工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式
结构型模式:适配器模式,桥接模式,过滤器模式,组合模式,装饰器模式,外观模式,享元模式,代理模式
行为型模式:责任链模式,命令模式,解释器模式,迭代器模式,中介者模式,备忘录模式,观察者模式,状态模式,空对象模式,策略模式,模板模式,访问者模式
设计模式会遵循以下六大原则:
开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、最少知道原则(迪米特法则)、合成复用原则。
2 - 为什么嵌入式要用设计模式?
纵观网络上很多嵌入式相关的代码例程,基本上都是面向过程和面向实现而进行编程的,一部分原因,是跟面向过程的C语言属性有关,
另一方面,很多嵌入式开发的入门教程,都没有对“设计模式”这些概念进行具体介绍,而是把侧重点放在了代码的执行过程和例程演示。
由于嵌入式开发一般脱离不了硬件底层设计,对于刚刚入行的嵌入式初学者,他们所接触的代码例程都是以面向过程面向实现来进行演示,
这就容易让他们形成了“过程实现式”思维,而非“对象抽象化”思维,这种思维定势,一般会伴随嵌入式软件工程师整个软件开发生涯。
设计模式无论对于自己对于他人,还是对于整个系统设计,都是多赢的,因为使用设计模式构建的系统,可以使软件代码实现真正的工程化,让代码更容易被他人理解,并且保证代码的可靠性,
因此,设计模式是软件工程的基石(此外,还有数据结构和算法)
在嵌入式软件开发过程中,每种设计模式都有其对应的工作原理,并且针对特定的问题给出该问题核心的解决方案,这也是设计模式在很多大中型软件工程中被广泛使用的原因。
设计模式为软件开发人员提供了标准的术语,并且每种设计模式都具体到了特定的情景,所以,经验不足的软件开发人员可以通过对设计模式的学习,简单快捷地掌握基本的软件工程设计。
使用C语言作为主要编程语言的Linux内核,里面大量使用了设计模式,没有面向对象设计思维,不会设计模式的工程师,一般很难理解Linux内核的设计精髓。
需要重点说明的是,本文以及本系列文章,并不是在“神化”并盲目放大设计模式的优势之处,也并不是泛指凡是嵌入式设备都必须用上设计模式作为编码指导,
作为嵌入式工程师,应该根据自身项目的复杂度以及项目规模,在兼顾开发效率的同时,选择合适的设计方案。
本系列文章旨在提供一种设计思路,当嵌入式软件工程师在开发过程中遇到实际问题的时候,可以更好地参考前辈总结的最佳实践方案。
3 – 嵌入式软件如何使用设计模式?
设计模式不是高级编程语言(面向对象编程语言)独有的东西,面向对象编程语言由于其语法特性,可以很方便很简单地在实际软件开发中应用设计模式。
而对于一名嵌入式软件工程师,学习设计模式,更多的是需要学习设计模式背后的原理,以及学习设计模式所针对的问题场景,从而养成设计模式的应用思维,而不是让思维受限于编程语言。
对于大多数嵌入式软件工程师而言,C语言是使用频率最高的编程语言,因此,在学习嵌入式软件如何使用设计模式之前,嵌入式软件工程师应该先学会如何使用C语言进行面向对象的设计。
在大中型嵌入式软件开发过程中,嵌入式工程师应注重养成面向对象和面向接口开发的思维方式,这对整个软件架构的可靠性和扩展性,都是有很大好处的。
网上有不少文章,讲述关于如何使用C语言进行面向对象程序设计,各位可以自行搜索学习,至少需要掌握如何用C语言实现面向对象语言的一些特性,如继承、封装、多态、组合,等等。
特别地说明一下,为了跟面向对象设计的概念同步,后面的文章会更多地使用面向对象开发的专业术语,比如:
封装:动词,表示用结构体把一系列的变量和函数指针进行打包。
继承:动词,表示用新的结构体包含一个父结构体,且这个父结构体要在首位置。
抽象:动词,表示开发者需要思考如何提取出事物的特征。
类:名词,表示进行封装之后的结构体类型,也就是指 struct uart_handler。
子类:名词,表示用一个新的结构体包含一个父结构体,得出一个新的结构体类型。
实例:名词,也可以叫对象或类对象,表示用结构体进行定义的变量,例如:struct uart_handler uart。