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

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

其中,p_this 指向模型对象,其调用形式详见程序清单 9.61。

程序清单 9.61 遍历视图链表范例程序

model_notify()通知更新显示内容函数的实现详见程序清单 9.62。

程序清单 9.62 model_notify()通知更新显示函数

其中,slist_foreach()为遍历视图链表函数,__view_process()回调函数依次处理各个链表结点(即视图),“处理”就是调用视图中的 pfn_update_view 函数,其对应的函数原型为:

通常在调用 pfn_update_view 函数时,需要传递 2 个参数,其分别为指向视图的指针和指向模型的指针。

由于视图的第一个成员为node,p_node为指向node的指针,其值为视图首元素的地址,与视图的地址相等,强制转换即可得到指向视图自身的指针:

此外,在 model_notify()函数调用 slist_foreach()函数时,将指向模型的指针作为回调函数的参数,因此__view_process()函数中的 p_arg 为指向模型的指针。为了类型匹配,强制转换即可得到指向模型的指针:

此前介绍的示例只是为了展示接口的使用,实际上 model_t 和 observer_t 并没有提供具体的实现,需要在应用中定义具体的视图类和模型类,比如,针对 LED 显示可以定义一个LED 视图类,针对布尔模型可以定义一个布尔模型类。

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

程序清单 9.63 mvc.h 文件内容

对称性

其实程序中处处充满了对称性,比如,model_attach()方法总会伴随着 model_detach()方法,一组方法接受同样的参数,一个对象中所有的成员都具有相同的生命周期。识别出对称性,将它清晰地表达出来,使代码更容易阅读。一旦阅读者理解了对称性所涵盖的某一半,自然也就很快地理解了另一半。

程序中的对称性指的是概念上的对称,无论在什么地方,同样的概念都会以同样的形式呈现。在准备消灭重复之前,常常需要寻找并表示出代码中的对称性。

3. 具体模型/ 视图

(1)布尔模型

虽然 model_bool_t 实现了 model_t 接口,但抽象模型中并没有与应用相关的业务逻辑,所以要在布尔模型中增加相应的数据,因为视图的核心就是观察数据并实时同步显示。

图 9.21 布尔模型类

虽然作为示例布尔模型仅包含一个值为 AM_TRUE 或 AM_FALSE的布尔值,但是各个视图都可以观察这个布尔值并实时同步显示。mvc参数传值其职责是管理观察对象的状态,实现 model_bool_get()获取布尔值和model_bool_set()修改布尔值的方法,以及在状态发生改变时,调用基类的方法 model_notify()通知所有关联的视图更新显示内容。布尔模型的类图详见图 9.21,其定义如下:

其中,am_bool_t 是 AMetal 在 am_types.h 中自定义的类型,其值为 AM_TRUE 或AM_FALSE。由于有了布尔模型,即可定义相应的实例,当将 model_bool 的地址传给形参p_this 后:

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

value 的初值将通过参数传递给初始化函数,其函数原型如下:

其中,p_this 指向模型对象,init_value 为布尔模型初值。其调用形式如下:

mvc参数传值_mvc 控制器之间传值_mvc传值关系

通常应该先初始化基类化,接着再初始化自身特有数据,model_bool_init()的实现详见程序清单 9.64。


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

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

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