10.1 复合模式简介
在前面的栏目中我们了解了各种设计模式。正如我们所看到的,设计模式可分为三大类:结构型、创建型和行为型设计模式。同时,我们还给出了每种类型的相应示例。然而,在软件实现中,模式并是不孤立地工作的。对于所有软件设计或解决方案来说,很少出现仅利用一种设计模式来实现的情况。
实际上,这些模式通常需要同时使用并加以组合,以实现特定的设计解决方案。根据GoF的定义,“复合模式将两个或更多模式组合成解决常见或普遍性问题的解决方案。复合模式不是同时使用的一组模式,而是一个问题的通用解决方案。
接下来,我们将介绍模型一视图一控制器(MVC)复合模式,该模式是复合模式的最佳示例,并且已经在许多设计解决方案中应用多年了。
10.2 模型一视图一控制器模式
MVC 模式的核心思想是将应用程序的逻辑分成三个部分:模型、视图和控制器。模型是负责数据存储和处理的部分,视图是负责数据显示的部分,控制器是负责协调模型和视图的部分。通过清晰地分离关注点,MVC 模式可以使应用程序更易于开发、测试和维护。
通常来说,人们会用网站为例来介绍MVC模式。当你浏览网站时会发生什么呢?你点击一个按钮,几个操作发生,你会看到你想要的内容。这是怎么回事?
- 你是用户,与视图交互。视图就是提供给你的网页。你点击视图上的按钮,它告诉控制器需要做什么。
- 控制器从视图获取输入并将其发送到模型。然后,模型会根据用户执行的操作来完成相应的动作。
- 控制器还可以根据其从用户接收的操作(例如更改按钮,显示其他UI元素等)要求视图进行相应的改变。
- 模型将状态变化通知视图。这可以基于一些内部变化或外部触发,例如点击按钮等。
- 视图随后展示直接从模型获取的状态。例如,如果用户登录到网站,会给他/她呈现一个仪表板视图(登录后)。需要在仪表板中填写的所有详细信息都是由模型提供给视图的。
MVC设计模式使用以下术语一模型、视图、控制器和客户端。
- 模型:声明一个存储和操作数据的类。
- 视图:声明一个类来构建用户界面和显示数据。
- 控制器:声明一个连接模型和视图的类。
- 客户端:声明一个类,根据某些操作来获得某些结果。
为了进一步探讨软件开发术语所说的MVC模式,先让我们来看看MVC模式中涉及的主要类。- 模型类定义针对数据的所有操作(例如创建、修改和删除),并提供与数据使用方式有关的方法。
- 视图类代表用户界面。它提供相应的方法,帮助我们根据上下文和应用程序的需要来构建 Web或GUI界面。它不应该包含自己的任何逻辑,而只应该用来显示收到的数据。
- 控制器类从请求接收数据,并将其发送到系统的其他部分。它需要提供用于路由请求的方法。
10.3 MVC应用场景
MVC模式经常用于以下情况。
- 当需要更改展示方式而不更改业务逻辑时。
- 多个控制器可用于使用多个视图来更改用户界面上的展示。
·- 再次重申,当模型改变时,视图无需改动,因为它们是相互独立的。
10.4 MVC模式的主要作用
简而言之,MVC模式的主要有以下作用:
- 将数据和数据的展示隔离开来。
- 使类的维护和实现更加简单。
- 灵活地改变数据的存储和显示方式。两者都是独立的,因此可以灵活修改。
10.5 MVC代码示例
在使用示例中,我们创建了一个 Model 对象、一个 View 对象和一个 Controller 对象。然后,通过调用 Controller 对象的 update_data() 方法,传入数据 “Hello, MVC!”,控制器会将数据设置到模型中,并通过视图显示数据。
# 模型类
class Model:def __init__(self):self._data = Nonedef set_data(self, data):self._data = datadef get_data(self):return self._data# 视图类
class View:def show_data(self, data):print("Data: ", data)# 控制器类
class Controller:def __init__(self, model, view):self._model = modelself._view = viewdef update_data(self, data):self._model.set_data(data)self._view.show_data(self._model.get_data())# 使用示例
model = Model()
view = View()
controller = Controller(model, view)controller.update_data("Hello, MVC!")
10.6 MVC的优点
以下是MVC模式的优点。
- 使用MVC,开发人员可以将软件应用程序分为3个主要部分:模型、视图和控制器。这有助于提高可维护性,强制松耦合,并降低复杂性。
- MVC 允许对前端进行独立更改,而对后端逻辑无需任何修改或只需进行很少的更改,因此开发工作仍可以独立运行。
- 类似地,可以更改模型或业务逻辑,而无需对视图进行任何更改。
- 此外,可以更改控制器,而不会对视图或模型造成任何影响。
- MVC还有助于招聘具有特定能力的人员,例如平台工程师和UI工程师,他们可以在自己的专业领域独立工作。