
周立功教授新书《面向AMetal框架与接口的编程(上)》,对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。经周立功教授授权,即日起,致远电子公众号将对该书内容进行连载,愿共勉之。
第九章为BLE&zigbee 无线模块,本文内容为9.3 MVC 框架。
>>> 9.3.1 MVC 模式
模型-视图-控制器(Model-View-Controller,MVC)模式是应用面向对象编程 SoC 原则的典型示例,模式的名称来自用于切分软件应用的三个主要部分,即模型部分、视图部分和控制器部分。它是 Smalltalk 中的用户界面框架,其目的是将模型从用户界面解耦。因为 Model相对来说比较稳定,而 View 和 Controller 相对来说容易变化,所以通过分层可以隔离变化。
而且视图与模型的分离带来的好处允许美工专心设计 UI 部分,程序员专心开发软件,互相不会干扰。MVC 包括 3 类组件:
Model:模型代表应用信息,负责“内部实现”的具体功能,包含和管理(业务)逻辑、数据、状态以及应用的规则,不依赖 UI;
View:通常在一个人机接口上呈现 Model 信息的抽象视图,即视图是模型的外在表现——用户界面的一部分,视图只是展示数据,但不处理数据。视图并非一定是图形化的,文本输出也是视图;
Controller:将用户输入分配到模型与视图中去,控制器也是用户界面的一部分,定义用户界面对用户输入的响应方式。
如图 9.10 所示为 MVC 框架的,视图和控制器合起来组成用户界面,用户界面包括输入和输出两部分:视图相当于输出部分——显示结果给用户,控制器相当于输入部分——响应用户的操作。这 3 类组件通过交互进行协作,View创建 Controller 后,Controller 根据用户交互调用Model 的相应服务。而 Model 会将自身状态的改变通知View,View则会读取Model的信息更新自身。比如,当用户通过单击(键入或触摸等)某个按钮触发一个视图时,视图将用户操作告知控制器。控制器处理用户输入,并与模型交互。模型执行所有必要的校验和状态改变,并通知控制器应该做什么。控制器按照模型给出的指令,指导视图更新显示内容输出。

图 9.10 MVC 框架
通常 MVC 被认为是一种框架模式,而不是一种设计模式,因为框架模式与设计模式之间的区别在于,前者比后者的范畴更广泛。其主要特征在于它能够为多个不同的视图提供数据,即同一个模型可以支持多个视图,模型的代码只需要写一次就可以被多个视图重用。假设在两个视图中使用同一个模型的数据,无论何时更改了模型,都需要更新两个视图,可以使用观察者模式解决。
>>> 9.3.2 观察者模式
观察者模式定义了一对多的对象之间的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新,因此观察者模式是一种行为模式,其适用于根据观察对象状态进行相应处理的场景。
在温度检测仪中,当温度传感器得到的值发生变化时,希望视图的内容同步改变。虽然可以在温度检测代码中附加更新显示的功能,但在本质上更新显示与温度检测是完全不同的两种处理方法,因此相互之间形成了高度依赖性的关系。
观察者模式就是一种避免高度依赖性的方法,构成观察者模式的有两个对象:发生变化的对象称为 观察对象(Subject),而被通知的对象称为 观察者(Observer)。如果观察对象的状态发生变化,则所有的观察者都会收到消息,同步更新自己的状态,因此这种交互方式又被称为“依赖”或“发布—订阅”。虽然观察对象是消息的发布者,但它发布消息时并不需要知道谁是它的观察者,因此观察者的数量是不限的,即观察对象维护了观察者对象的结合。现在的问题是,如果观察者与观察对象互相引用,它们变得互相依赖,这可能会对一个系统的分层和重用性产生负面影响。基于此,观察者模式通过定义一个接口通知观察对象发生了变化,从而将观察者与观察对象解耦,只依赖于观察者和观察对象的抽象类,从而保证了订阅系统的灵活性和可扩展性。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-65228-1.html
于是俺们厂里买了好多跟废品差不多的浙商设备
央视应该道歉