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

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

图 9.19 抽象视图类

显然,有了 observer_t 类,就可以定义相应的实例 view,当将对象 view 的地址传给形参 p_this 后:

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

虽然 pfn_update_view 看起来是一个“数据成员”,但从概念视角来看,其定义的是一个在具体视图类中实现的抽象方法,其目的是将模型和视图“解耦”。

在面向对象编程时,每个对象(类)都有一个用于对象初始化的“构造函数”,初始化成员变量等,而 C 语言则需要显式地调用 view_init()初始化函数。其函数原型如下:

其中,p_this 指向视图对象,pfn_update_view 指向与视图对应的显示函数,其调用形式详见程序清单 9.54。

程序清单 9.54 视图初始化函数范例程序

在 main()中调用对象 view 的初始化函数 view_init(),用 OOP 术语来说,这是给对象 view发送一条消息,通知它进行自我初始化。view_init()的实现详见程序清单 9.55。

程序清单 9.55 view_init()初始化函数

在面向对象 C++编程时,虽然每个类都有“构造函数”,但有时候可能为空,因此不会将构造函数作为方法展示在类图中。而面向对象 C 编程——虽然 view_init()看起来像抽象视图类提供的接口,但其功能类似于“构造函数”,因此没有呈现在相应的类图中。

(2)抽象模型类

由于抽象模型仅需管理与之关联的视图,其本质上是管理了一个视图链表,因此仅包含一个链表头结。此外,还需提供增加、删除、遍历视图的方法,model_t抽象类的定义如下:

其中,head 为链表的头结点,其类图详见图 9.20。显然有了 model_t 类,即可定义相应的实例,当将 model 的地址传给形参 p_model 后:

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

图 9.20 抽象模型类

类似地,需要初始化模型中的各个成员,其函数原型如下:

其中,p_this 指向模型对象,其调用形式如下:

model_init()模型初始化函数的实现详见程序清单 9.56。

程序清单 9.56 model_init()模型初始化函数

初始化后,需要将视图保存到链表中。当模型的状态变化时,即可遍历链表找到与视图对应的显示函数,通知视图更新显示内容。其函数原型如下:

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

程序清单 9.57 添加视图范例程序

为了避免直接访问数据,将通过接口函数和对象交互,model_attach()添加视图函数的实现详见程序清单 9.58。

程序清单 9.58 model_attach()添加视图函数

如果观察者只对某一事件感兴趣,则可以扩展观察对象的注册接口,让观察者注册为“仅对特定时间感兴趣”,以提高更新的效率。

当不再使用某个视图时,则将其从链表中删除,其函数原型如下:

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

程序清单 9.59 删除视图范例程序

model_detach()删除视图函数的实现详见程序清单 9.60。

程序清单 9.60 model_detach()删除视图函数

当模型对象的状态变化时,需要遍历保存在模型中的视图对象链表,并调用每个视图对象的 pfn_update_view(),才能通知所有的视图更新显示内容。其函数原型如下:


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

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

    • 冯瑞姣
      冯瑞姣

      这样的“优质资源”当然他自己享受了

    • 林披
      林披

      小男神太棒了爱你

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