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

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

遍历视图

当模型的状态发生变化时,则需要调用 model_notify()遍历保存在模型中的视图链表,并调用每个视图的 pfn_update_view(),才能通知所有的视图更新显示内容。而 model_notify()又是调用遍历链表函数 slist_foreach()实现的,遍历视图的 slist_foreach()函数原型如下:

其调用形式如下:

除了在序列图中显示了对象协作的动态视图外,还需要设计模型类图表示类定义的静态视图描述类的属性和方法。由于链表属于基础设施领域的概念,不是业务逻辑领域的概念,说明复用级别是基于基础设施域的,没有基于核心域,因此存储视图的是数组、链表还是其它的容器,都不影响核心域的概念。这就是链表不会出现在分析工作流中,只有设计工作流中才考虑的原因。基于此,不仅需要将链表的 slist_head_t 类型(slist.h)头结点 head 包含在model_t 抽象模型类中作为数据成员,而且需要将链表的 slist_node_t 类型(slist.h)普通结点node包含在observer_t抽象视图类中作为数据成员。

图 9.18 设计模型类图

如图 9.18所示为 MVC框架的设计模型类图,图中的“0..*”说明模型与视图呈现一对多的关系。显然基类的方法子类也有,由于 model_attach()、model_detach()和model_notify()是在model_t类的接口中实现的,而在 model_bool_t 子类中没有实现,因此在绘制 UML 图时则不需要重复表示,但子类还是继承了父类的方法。而 observer_t 基类的 pfn_update_view()抽象方法是在子类中实现的,因此在绘制 UML 图时必须显式地表示。

2. 抽象视图/ 模型

(1)抽象视图类

当模型对象的状态变化时,所有视图共用函数指针 pfn_update_view,调用各自对应的显示函数 view_update 更新显示内容。update_view_t 类型定义如下:

在面向对象 C++编程中时,方法是通过一个隐式的 p_this 指针,使其指向函数要操作的对象,访问自身的数据成员。而在面向对象 C 编程时,则需要显式地声明 p_this 指针。使其指向函数将要操作的视图对象,访问视图对象的数据成员。

p_model 指向视图观察的模型,其目的是获取模型的数据,使显示数据与模型数据保持一致。由于 pfn_update_view()方法使用了模型类定义的指针变量 p_model,而在该函数的实现中调用了模型类的方法 model_bool_get(),即一个类使用了另一个类的操作,因此可以说视图依赖于模型。

依赖是两个元素之间的一种关系,其中一个元素变化,将会导致另一个元素变化。虽然依赖的同义词就是耦合和共生,但依赖是不可避免的,重要的是如何务实地应付变化,这就是良性依赖原则。通常在 UML 中将依赖画成一条有向的虚线,指向被依赖的类。

由此可见,良性依赖可以帮助我们抵御 SOLID 原则与设计模式的诱惑,以免陷入过度设计的陷阱,带来不必要的复杂性。

由于链表的每个结点存储都是视图,因此遍历视图链表需要从头结点 node 开始。这是一种常见的 is-a 层次结构,其共同的概念用抽象类表示,差异化分析所发现的变化将通过从抽象类派生而来的具体类实现。observer_t 抽象类的定义如下:

其中,node 为链表结点成员,pfn_update_view 指向与视图对应的显示函数,比如,view_update,抽象类 observer_t 的类图详见图 9.19。


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

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

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