mvc参数传值 应用面向对象编程SoC原则的典型示例(10)

电脑杂谈  发布时间:2018-02-05 18:03:21  来源:网络整理

其中,p_view_led 指向 LED 视图对象,led_id 为 LED 的编号。其调用形式如下:

通常需要先初始化抽象视图(基类),接着再初始化私有数据成员 led_id 等,初始化抽象视图的函数原型(mvc.h)如下:

在实现 view_led_init()时,需要先实现与其对应的显示函数,详见程序清单 9.70。

程序清单 9.70 LED 视图显示函数的实现

基于此,LED 视图初始化函数的实现详见程序清单 9.71。

程序清单 9.71 LED 视图初始化函数的实现

视图在得到通知后,需要知道究竟是 model_t 类中哪个状态发生了变化,发生了何种变化。通常在通知接口 pfn_update_view 中不传送这些信息,而是在视图得到通知后,再反过来调用 model_bool_get()查询状态的函数。然后视图再决定自己应该做什么事情,这时pfn_update_view 的参数就是 model_t 类的指针。

当布尔模型的状态发生变化时,为了实现自动调用 LED 视图对应的显示函数,那么 LED视图需要预先将自己添加到模型对象的链表中保存起来。比如:

为了便于查阅,程序清单 9.72 展示了 view_led.h 文件的内容。

程序清单 9.72 view_led.h 文件内容

至此,实现了一个具体模型(布尔模型)和一个具体视图(LED 视图),具有单个视图的模型完整示例详见程序清单 9.73。

程序清单 9.73 单个视图的范例程序(main.c)

zigbee 视图

zigbee 视图继承自抽象视图,同时具有一个私有数据成员 zm516x_handle,其为 zigbee实例句柄,通过该句柄,即可使用相应的接口函数操作 zigbee 模块,zigbee 视图定义如下:

zigbee 视图类 view_zigbee_t 实现了 observer_t 接口,其对应的类图详见图 9.23。

图 9.23 zigbee 视图类

有了zigbee 视图,即可定义相应的视图对象,当将 view_zigbee 的地址传给 p_view_zigbee 后:

即可按 p_view_zigbee 的指向引用其它成员。

类似地,定义 zigbee 视图的初始化函数原型如下:

其中,p_view_zigbee 指向 zigbee 视图对象,zm516x_handle 是 zigbee 模块的实例句柄,可通过 ZM516X 模块的实例初始化函数获得。其调用形式如下:

在实现 view_zigbee_init()时,也需要先实现与其对应的显示函数,详见程序清单 9.74。

程序清单 9.74 zigbee 视图显示函数的实现

其中,am_zm516x_send()函数的作用是通过 zigbee 发送字符串至目标地址的节点(目标地址在初始化时配置),其函数原型(am_zm516x.h)为:

基于此,zigbee 视图初始化函数的实现详见程序清单 9.75,其除了初始化抽象视图类外,还完成了 zigbee 模块的地址配置,配置本地地址为 0x2001,目标地址为 0x2002。

程序清单 9.75 zigbee 视图初始化函数的实现

为了便于查阅,程序清单 9.76 展示了 view_zigbee.h 文件的内容。

程序清单 9.76 view_zigbee.h 文件内容

由此可见,当新增加 zigbee 视图后,虽然与 LED 视图不一样,但可以共用同一个模型。

且 LED 视图和布尔模型都不需要做任何修改,同时也没有一行重复的视图代码,说明“用户界面与内部实现”真正做到了分离。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-65228-10.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...