1 - 什么是外观模式?
外观模式(Facade Pattern),是一种比较简单的结构型模式,它存在的目的,也是为了简单。
外观模式隐藏了一系列接口的复杂性,旨在为外部客户端提供一个更高层次且统一简单的接口,简化了客户端调用某些模块的一系列操作。
外观模式应该是软件工程师们经常使用到的一种设计模式,在很多情况下,我们会习惯性地把一系列复杂的操作,封装成一个简单的接口,供外界调用。
外观模式的优点很明显,它可以减少应用客户端程序与系统之间相互的依赖,因为对外接口简单,所以提高了灵活性和安全性。
但也有缺点,外观模式违反了开闭原则,如果要改函数里面的东西,也会比较麻烦。
2 - 什么情况下要用外观模式?
在嵌入式C语言软件设计的时候,通常我们会遇到很多复杂的芯片外设操作,比如,要使用LCD显示图片之前,需要先对LCD进行一系列初始化。
初始化芯片的LCD控制器,LCD背光接口,DMA2D外设,等等,而外部在调用的时候,虽然可以分别调用这些外设初始化函数,但整个过程略显复杂。
比较简单方便的方法就是,提供一个统一的函数接口,比如display_module_init(),在这个函数里面包含LCD相关的外设初始化,外部只需要调用这个统一的函数接口就可以了。
不仅是LCD显示,在很多情况下,都可以使用外观模式,比如,网络数据发送,串口配置,存储芯片初始化,内存控制器初始化,等等。
外观模式的最终目的,就是要隐藏一系列复杂的函数调用,给外部一个简单方便统一的接口。
3 - 如何使用外观模式?
以显示模块(display_module)为例,讲述一下如何使用嵌入式C语言实现外观模式。
通常情况下,显示模块里面的LCD相关初始化,会涉及到LCD控制器的初始化,LCD背光初始化,DMA2D的初始化。
1、把LCD相关初始化操作,都放在display_module.c文件里面统一进行管理,比如lcd_gpio初始化,背光控制初始化,DMA2D初始化,这些都是跟显示模块相关的一系列复杂操作,代码如下图所示。
2、关于显示模块初始化,对外提供一个统一简单的接口,如display_module_init()函数,在这个函数里面,包含了以上几个LCD初始化相关的函数,代码实现如下图所示。
3、在客户端main函数里面,初始化显示模块,以往经常使用的方式是分别调用LCD相关的初始化函数,但使用了外观模式后,只需要调用一个统一的函数接口,就可以完成LCD相关的初始化了,具体实现代码如下图所示。
4 - 怎样验证外观模式?
本例程的代码是使用标准C语言进行编写,可以在PC端进行验证,使用标准的GCC编译器进行编译。
也可以在嵌入式开发板里面验证本例程的代码,需要根据开发板官方提供的指引,自行搭建好开发环境,并且把编译器更换为开发板对应的交叉编译器即可。
编译出来的程序,执行结果如下图所示。
暂无评论