电子科大软件架构设计——期末复习题集

系统分析与设计概述

1.下面哪个不是信息系统利益相关者?(D)

A.客户B.用户 C.开发人员D.监理人员

2.下面哪项不是用户主要关注的软件质量属性?(B)

A.安全性B.可复用性C.灵活性D.高效性

3.在信息系统生命周期中,下面哪个阶段持续时间最长?(D)

A.系统需求分析B.系统设计 C.系统构造 D.系统运行与维护

4.下面哪种系统开发过程模型不需要迭代?(A)

A.瀑布开发过程模型 B.原型开发过程模型 C. RUP开发过程模型 D.敏捷软件开发过程模型

5.下面哪种系统开发策略可培养机构自身的开发团队?(D)

A.自行开发 B.委托开发 C.购买商品化软件包 D. 联合开发

1.项目经理是系统构造人员之一。(×)

2.信息系统是指一类处理信息的系统软件。(×)

3.系统规划是在项目立项之后进行的。(×)

4.敏捷软件开发过程模型是一种轻量级的过程模型。(√)

5.应用软件依赖于系统运行环境。(√)

信息系统通常由信息化基础设施、应用软件、数据库管理系统、数据库、业务数据、(用户)等要素组成。

软件被划分为系统软件、应用软件和(中间件)。

在信息系统生命周期中的(系统规划)、系统需求分析、系统设计阶段进行系统分析与设计活动。

在螺旋式开发过程模型中,系统软件编码是在(实施工程)阶段的开发活动。

复用粒度最大的系统开发方法是(面向服务开发)。

四、简答题

1.比较系统分析员与系统架构设计师的角色职责有何异同?

答:系统分析员与系统架构设计师相同职责是建立信息系统总体方案。不同点在于系统分析员负责系统需求分析,系统架构设计师负责系统架构设计。

2.说明软件本质特性有哪些?

答:软件本质特性如下:

•软件是逻辑代码组成的程序集合,非有形物体。

•软件不会损耗,但会因失去价值被弃用。

•软件是开发人员通过脑力劳动开发出来的,还不能做到生产线制造。

•软件还未完全实现标准化构件组装系统。

3.说明哪些开发活动跨系统生命周期?

答:跨系统生命周期的开发活动主要有项目计划、软件测试、项目管理、风险管理等活动。

4.敏捷软件开发过程模型如何实施?

答: 敏捷软件更强调编程人员与业务专家之间的紧密协作、面对面的沟通、适应需求变化地代码编写、注重系统开发过程中人的作用、最小化文档编写,快速发布系统版本功能,并能够处理不断变化的用户需求。 强调精简的、快速的、增量迭代的软件开发。

5.现代软件系统开发的主流技术方法有哪些?

答: 现代软件系统开发的主流技术方法包括面向对象软件开发、基于构件的软件开发、面向服务的软件开发方法。

面向对象建模语言

1.下面哪个不是面向对象思想中的概念? (B)

A.封装B.包含C.多态D.抽象

2.UML结构图不包含下面哪种图?(A)

A.用例图B.类图C.构件图D.部署图

3.类图中包含下面哪个元素?(D)

A.类 B.关联关系 C.接口 D.以上都是

4.顺序图不包含下面哪个元素? (A)

A.泳道 B.对象 C.消息 D.生命线

5.模型是(A)

A.现实世界的简化描述

B.现实世界的完整描述

C.现实世界的具体化描述

D.现实世界的封装

1.面向对象的需求分析与编程语言无关。(√)

2.活动图可以表示并发活动。(√)

3.每个状态机图可以反映多个对象的状态。(×)

4.部署图的节点中可以嵌入构件。(√)

5.BPMN可以基于WS-BPEL转换为软件流程组件。(√)

6.状态机图有自转换状态。(√)

  • 面向对象的思想应用包括面向对象分析、(面向对象设计)、面向对象编程。

  • 类图中类之间的关系有关联关系、依赖关系、聚合关系、(泛化关系)。

  • 通信图中的元素包括对象、(消息)、链、自反链。

  • BPMN流对象分为三类:活动、(事件)、网关。

  • BPMN中数据分为数据对象、(数据对象集)、数据输入和数据输出等。

1.面向对象的分析与面向对象的设计在具体实施上有什么区别?

答:面向对象的分析是进行需求分析,输出是需求规格说明书,是面向对象设计的输入。面向对象分析主要是绘制用例图、活动图、时序图和关键类图。

面向对象设计的输出是面向对象编程的输入。面向对象的设计更注重绘制系统的详细类图、组件图和部署图等。

2.BPMN 和 UML 建模语言的应用场景有什么区别?

答:BPMN 建模语言更侧重于流程建模,在流程建模方面比UML有更多元素,表达的语义更为丰富;

UML 建模语言更侧重于面向对象的系统分析与设计,包含的内容更为广泛,如用例图、时序图、活动图、类图、部署图等。

3.UML建模语言的面向对象思想体现在哪些方面?

答:UML的视图均体现了面向对象的思想,如类图是描述类及类之间关系的视图,是一种典型的面向对象思想,其他的如用例图、时序图等也包含了对象。

4.包图与类图是否可以放在一起?

答:可以放在一起,将类图的类放在包图的包中。

5.不同层级的 BPMN 流程是如何表现与协作的?

答: BPMN 流程通过子流程实现父流程和子流程的关联。子流程活动是一个复合活动,包含了活动、网关、事件和序列流等元素,它由在圆角矩形的下边界线上标注一个加号“+”表示。子流程活动的输入是前序活动的输出,子流程活动的输出提供给后续活动。

6.针对顾客在比萨店就餐过程进行业务流程分析,说明 BPMN 各元素如何使用。

image-20231220214938716

ChatGPT4

流程始于顾客感到饥饿想吃比萨的状态。顾客首先选择心仪的比萨然后下单,比萨店确认订单后进入制作阶段。比萨烘烤期间,如果顾客询问“我的比萨在哪里?”则需要通过客服安抚顾客,并保持顾客的耐心。当比萨烘烤完成后,比萨店将比萨交付给顾客,顾客在收到比萨后进行支付,支付方式可以是现金或其他电子支付方式。最后,顾客享用比萨,完成整个就餐过程,顾客的饥饿感得到满足,流程结束。

流程图中的各个符号表示如下:

  • 开始事件:空心圆表示流程的开始,即顾客感到饥饿。
  • 任务:圆角矩形表示需要执行的动作或活动,如选择比萨、下订单、烘烤比萨等。
  • 网关:菱形符号表示决策点或流程分支,比如“我的比萨在哪里?”的询问导致的流程分支。
  • 结束事件:加粗圆圈表示流程的结束,即顾客饥饿得到满足。
  • 连线:箭头表示活动之间的流向,指示了流程的顺序。
  • 消息流:虚线箭头表示信息交换,如顾客和比萨店之间的订单信息交换。
  • 数据对象:带有角折的矩形表示流程中使用或生成的数据,例如订单、收据和金钱。

整个流程图详细展示了顾客从进入比萨店到满足饥饿的完整业务流程,明确了各个步骤及其相互之间的联系。

7.针对如下电商系统构件图模型分析,说明电商系统构件组成结构的 UML 元素使用。

image-20231220215806058

ChatGPT4:

  1. 组件(Component):带有两个小矩形的大矩形表示组件,它们是系统的物理部分,通常对应于可部署的软件单元。在您的图中,“Product”,“Customer”,“Order”和“Account”都是电商系统的组件。
  2. 接口(Interface):小圆形符号表示组件之间的接口,这些是组件对外提供服务的点或者从其他组件接收服务的点。在您的图中,“Item Code”和“Customer Details”是组件“Product”和“Customer”暴露出的接口,而“Payment”和“Account Details”是组件“Order”和“Account”暴露出的接口。
  3. 连线:实线表示组件之间的关系,具体到接口级别的连接。在您的图中,实线连接了“Product”和“Order”以及“Customer”和“Order”,表示这些组件间通过特定的接口相互作用。
  4. 依赖关系(Dependency):虚线箭头表示一个组件依赖于另一个组件的服务。在您的图中,“Order”组件通过“Payment”接口依赖于“Account”组件提供的“Account Details”服务。

这样的组件图有助于软件开发人员和系统架构师理解系统的高层结构,以及不同组件之间是如何通过接口进行通信和交互的。

补充知识:

在UML图中,接口和构件之间用实线连接表示实现关系;而接口和构件之间用虚线箭头连接则表示依赖关系。导出接口由提供操作的构件提供。导入接口供访问操作的构件使用。

img

8.针对如下订单查看序列图模型分析,说明订单功能逻辑的 UML 元素如何使用。

image-20231220230813126

ChatGPT4:

UML序列图是一种用于显示对象之间如何在时间序列内交互的图表,它特别适用于展示特定用例或功能流程的实现。在这个图中使用的UML元素及其作用如下:

  1. 参与者(Actor):表示为小人图标的“Client”,代表与系统交互的外部实体,通常是用户或其他系统。
  2. 边界对象(Boundary Object):用带有<<boundary>>标签的矩形表示,如图中的“View Open Orders”,代表系统的用户界面或用于与用户直接交互的部分。
  3. 控制对象(Control Object):用带有<<control>>标签的矩形表示,如图中的“:View Open Orders”,代表协调其他对象或组件以完成特定任务的对象。
  4. 实体对象(Entity Object):代表系统中的一个实体,通常对应于系统的数据模型。在这个图中,“:Account”和“:Transaction”表示与账户相关的信息和交易相关的信息。
  5. 生命线(Lifeline):垂直的虚线表示对象的存在,延伸到整个交互过程。
  6. 激活条(Activation Bar):表示对象正在进行处理的时间段,通常为垂直的矩形。
  7. 消息(Message):箭头线表示对象之间传递的消息。实线箭头表示同步调用,即发送者等待接收者完成处理;虚线箭头表示返回消息,即操作完成后的响应。

在您的图中,客户端首先向“View Open Orders”发送请求,接着“:View Open Orders”控制对象处理该请求。它进一步与“:Account”和“:Transaction”实体对象交互,分别通过loadAccountDetails()loadOpenOrders()方法检索账户详情和未完成订单的数据。这些方法的调用和返回都在序列图上清晰地表示。

系统规划

1.下面哪项不属于系统规划的内容?(D)

A.信息系统目标

B.业务流程重组

C.软件系统方案

D.软件模块设计

2.下面哪项不是系统规划方法?©

A. KSF

B. VCA

C. ERP

D. BSP

3.下面哪项不是VCA规划方法中的基本活动?(A)

A.技术研究

B.生产

C.销售

D.售后服务

4.下面哪种评估方法适合于任务工期估算?(D)

A.三点估计法

B.德尔菲法

C.类比估算法

D.以上都可以

5.下面哪种可行性分析是企业最关心的?©

A.技术可行性

B.进度可行性

C.经济可行性

D.社会可行性

1.系统规划需要在项目立项后进行。(×)

2.信息系统建设目标必须支持组织机构战略目标达成。(√)

3.系统规划内容包括功能需求分析。(×)

4.BSP方法可以直接将组织机构目标转换为信息系统目标。(×)

5.在完成项目成本预算后就可以进行任务分工。(×)

系统规划涉及组织机构的信息系统目标、信息化现状分析、系统建设方案、(信息系统建设计划)等内容。

系统规划步骤包括规划准备、初步调查、战略与现状分析、(制定信息系统建设目
标和战略)和确定总体架构等。

业务流程重组强调以(业务流程为中心)、以关心客户的需求和满意度为目标,
对现有业务流程进行不断地优化或重新设计。

企业价值链分析可以从内部价值链、纵向价值链和(横向)价值链角度进行分析。

在项目成本估算中,既可以用货币单位表示,也可以采用工时、人月、(人天)
等单位表示。

1.针对如下项目的甘特图,分析该项目的并行任务、前置任务、里程碑,并说明该项目总工期是多少。

image-20231221140208363

  • 并行任务:这些任务在时间上是重叠的,即它们在甘特图上表示为同时进行的任务。在甘特图上,您可以通过查找时间线上同时进行的条形来识别并行任务。
  • 前置任务:这些任务在其他任务开始之前必须完成。在甘特图上,前置任务通常通过箭头或线条连接表示,显示任务之间的依赖关系。
  • 里程碑:这是项目时间表中的重要点或事件。里程碑通常用符号或特殊标记表示,如钻石形或特别的标记,它们通常没有持续时间。
  • 总工期:项目的总工期是从第一个任务开始到最后一个任务完成的时间长度。

86个工作日。

2.针对如下项目的 PERT 图,分析该项目完成所需的最少时间天数,并找出其中关键任务。

image-20231221140316075

48天,A->D->F->H->G

3.针对一个选课系统的项目计划,设计项目进度安排的甘特图。

答:采用 project 项目管理工具制定选课系统的项目计划,首先给出甘特图。

image-20231221141604784

2.针对一个选课系统的项目计划,设计项目进度安排的 PERT 图。

答:在 project 项目管理工具中将本项目甘特图对应转换为网络图 (PERT 图)。

image-20231221141713423

系统需求分析

1.下面哪种需求采集方法是通过触发问题的想法发挥作用的?B

A.调查表法

B.头脑风暴法

C.原型法

D.研究现有文档与系统

2.下面哪种关系不出现在UML用例图中?D

A.包含

B.扩展

C.泛化

D.复合

3.下面哪种关系在类图中表示一个类是另一个类的一部分? A

A.聚合

B.扩展

C.泛化

D.关联

4.活动图包含下面哪个元素?D

A.活动

B.分支

C.并发

D.以上都是

5.以下哪种不是非功能性需求? A

A.录入成绩

B.安全性需求

C.可扩展性

D.可靠性需求

1.BPMN的编排流程中没有泳池。(√)

2.UML用例之间的表示扩展关系的箭头是从扩展用例指向被扩展用例。(√)

3.活动图无法表达并发执行的活动。(×)

4.类图中两个类之间的泛化关系是指两个类之间的一般与特殊关系。(√)

5.需求变更管理需要有专门的变更过程控制。(√)

观察法分为旁观式观察、解释式观察、(参与式观察)。

调查表中的封闭式问题有3种形式:单选/多选问题、评价问题、(排序问题)。

用例图包含的元素有用例、关系、(角色)。

需求规格说明书中非常重要的三部分内容分别是功能性需求,(非功能性需求)、接口需求。

一个类包含三方面要素:类名、属性、(方法)。

1.什么是原型法,它对需求采集的作用如何?

答:原型法是通过构造一个软件原型对待开发的系统进行可视化模拟,从而获得用户对需求反馈的方法。

原型法作用:当用户无法准确描述需求的时候,原型法是一种非常有效的需求引导与采集方法。实际上,原型需求采集法是基于原型的软件工程过程模型的一部分,以原型为媒介,不仅让需求分析员与用户之间对需求的理解保持一致性,而且对项目难点、工作量的评估也起到了重要支撑作用。

2.调查与调查表有什么区别?

答:调查是使用各种方法了解一个事情的原委与事情情况。调查表是通过向被调查者发放预先设计的调查表格,要求被调查者填写后限时返回,然后整理分析的一种需求调查方法。调查表可以算是一种调查方法。

3.用例规格说明中的主事件流与备选流有什么区别?

答:主事件流指的是基本流程,是用例无论如何均会执行的流程;备选流指的是备选流程,描述了在某些特殊条件下会执行的流程,比如异常流程。

4.实体类是什么?在类建模中还需要区分哪些种类的类?

答:实体类是抽象描述大自然中自然存在的物体的类,比如:人、桌子、筷子、房子、羊等。除了实体类,还有概念类、事件类、组织类、人员类、岗位类等。

5.参与者能有属性与操作吗?

答:参与者作为一个对象的时候,是可以有属性和操作的。

6.针对如下商品订购业务流程进行分析,抽象出实现该业务处理的业务用例图模型。

image-20231221185531243

ChatGPT4:

要从这个BPMN中抽象出业务用例图模型,您需要识别参与流程的角色、将用于处理订单的系统,以及角色和系统之间的交互。

以下是从BPMN抽象出用例图的步骤:

  1. 识别参与者:寻找与流程交互的最终用户或外部系统。这可能是客户、销售代表或库存管理系统。
  2. 定义系统边界:确定所考虑的系统是什么。这通常是处理BPMN中描述的业务逻辑的订单处理系统。
  3. 提取用例:识别系统提供的主要功能。BPMN中代表重要动作或决策的每个步骤都可以被认为是潜在的用例。例如,“下订单”、“检查库存”、“处理付款”等。
  4. 创建关系:定义用例之间的关系(如包含、扩展)以及参与者和用例之间的关系(如关联)。

7.针对如下图书管理用例图进行分析,抽象出实现图书管理用例的分析图模型。

ChatGPT4:

要从用例图抽象出分析模型,您可能需要创建一个类图或者对象图,这些图可以展示系统的结构和类之间的关系。这通常涉及以下步骤:

  1. 识别类:从用例中提取可能的类,比如“图书”、“借书记录”、“用户”等。
  2. 定义属性和操作:为每个类确定其属性(如图书的ISBN、标题、作者)和操作(如查询、借出、归还)。
  3. 确定类之间的关系:包括关联(两个类如何相互关联)、聚合(表示类与类之间的整体与部分的关系)、组合(一种更强的整体与部分的关系)、继承(子类如何从父类继承属性和操作)等。

针对该用例图,我们可以按照以下步骤抽象出一个分析模型:

  1. 定义实体类(Entity Classes)
    • 图书(Book):包含书名、作者、ISBN、出版信息等属性。
    • 用户(User):属性可能包括用户ID、姓名、密码、借阅历史等。
    • 借阅记录(Borrowing Record):包含借阅日期、归还日期、借阅的图书等。
  2. 定义控制类(Control Classes)
    • 图书管理(Book Management):负责图书的增加、删除、修改、查询等操作。
    • 用户管理(User Management):负责用户注册、信息修改、权限管理等。
    • 借阅控制(Borrowing Control):处理图书借阅和归还的业务逻辑。
  3. 定义边界类(Boundary Classes)
    • 系统界面(System Interface):与用户进行交互的界面,如图书查询界面、借阅界面等。
    • 管理员界面(Admin Interface):供管理员使用的界面,用于执行图书和用户管理等操作。
  4. 描述类之间的关系
    • 用户与借阅记录之间是一对多的关系,一个用户可以有多条借阅记录。
    • 图书与借阅记录也是一对多的关系,一本书可以被多次借阅。
    • 控制类与实体类之间是关联关系,例如,图书管理控制类会操作图书实体。
    • 控制类与边界类之间是关联关系,例如,用户管理控制类通过系统界面与用户交互。
  5. 建立继承关系(如果适用)
    • 如果有共同的属性或行为,可以考虑使用继承。比如,如果系统中有多种类型的用户(管理员、读者等),它们可以从一个共同的用户基类继承。

系统架构设计

1.高质量的信息系统主要由下面哪项工作决定?(A)

A.系统设计

B.软件编程

C.软件测试

D.软件运维

2.下面哪种设计方法只应用在面向对象系统设计中?(D)

A.抽象设计

B.逐步求精

C.模块化设计

D.信息隐蔽

3.下面哪种UML模型图只用于系统总体设计建模?(D)

A.系统类图

B.顺序图

C.通信图

D.系统部署图

4.用户最关心下面哪种架构?(A)

A.应用架构

B.软件架构

C.数据架构

D.拓扑架构

5.下面哪种软件架构风格最适合复杂软件系统?(A)

A.分层体系架构

B.客户机/服务器体系架构

C.微核体系架构

D.数据共享体系架构

二、判断题

1.类图模型在系统设计各阶段都需要涉及。(√)

2.系统数据架构是一类数据库模型。(×)

3.系统架构的核心视图就是软件架构。(√)

4.客户机/服务器体系架构适合Web应用。(√)

5.异步消息通信模式适合银行转账业务。(×)

系统架构通常包括系统拓扑架构、系统数据架构、系统软件架构和(系统应用架构)等。

典型软件系统一般被划分为表示层、业务逻辑层、(数据存取访问层)和数据存储层。

客户/服务模式可以细分为(多客户/单服务模式)、多客户/多服务模式、多层客户/服务模式。

在面向服务的软件架构中,其通信模式主要有服务注册通信模式、(服务代理转发通信模式)、服务句柄代理转发通信模式、服务发现通信模式。

软件对象之间的消息通信模式主要有同步消息通信模式和(异步消息通信模式)。

1.系统设计过程涉及哪些主要开发活动?

答:系统设计涉及大量开发活动,主要包括基础设施平台设计、系统架构设计、系统构件设计、程序流程设计、数据库设计、用户界面设计、 安全机制设计等。

2.系统架构设计如何满足系统非功能需求?

答:系统架构决定了系统非功能特性,如系统可靠性、可用性、安全性、可伸缩性,以及系统性能。因此,在系统设计中,根据应用需求,可选择合适的系统架构模式进行系统架构设计。

3.系统数据架构设计一般给出哪些内容?

答:系统数据架构通常需要给出系统数据资源的组织与存储结构。它不仅需要反映数据结点的分布关系,还需要考虑这些数据资源的存储方式,如文件存储、数据库存储或数据仓库存储。系统数据架构与系统拓扑架构、系统应用架构密切相关,但它是从数据资源角度,反映信息系统的数据结点组成关系。

4.微服务与微核体系架构有何异同?

答:微服务(Microservice)是指一类细粒度的 Web 服务,每个服务都是自包含的,并且应该实现单一的业务功能。微核体系架构又称为"插件架构",系统的软件内核相对较小,主要功能和业务逻辑都通过插件实现。

5.软件架构模式在开发中如何选择?

答:软件架构模式就是针对特定需求问题及其环境,所给出通用的软件架构设计解决方案。针对具体应用,分析该应用系统的非功能特性需求及解决特定问题,选取合适的软件架构模式。

6.针对一个在线点餐外卖系统,给出该系统的架构模型设计。

1)类图

image-20231222162152644

image-20231222162241843

2)包图

image-20231222162321777

3)序列图

在这里插入图片描述

在这里插入图片描述

4)构件图

image-20231222162814942

image-20231222162852336

5)部署图

image-20231222162916050

7.架构模式、软件框架、设计模式分别指什么?它们之间是什么关系?

  • 概念

    架构:简单的说架构就是一个蓝图,是一种设计方案,将客户的不同需求抽象成为抽象组件,并且能够描述这些抽象组件之间的通信和调用。

    框架:软件框架是项目软件开发过程中提取特定领域软件的共性部分形成的体系结构,不同领域的软件项目有着不同的框架类型。框架不是现成可用的应用系统。而是一个半成品,提供了诸多服务,开发人员进行二次开发,实现具体功能的应用系统。

    设计模式:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,它强调的是一个设计问题的解决方法。

  • 框架与架构关系

    首先说框架不是架构,应该说框架比架构更具体,更偏重于技术,而架构偏重于设计。还有一个关系就是架构可以通过多种框架来实现。

  • 框架与设计模式关系

    设计模式研究的是针对单一问题的设计思路和解决方法,一个模式可应用于不同的框架和被不同的语言所实现;而框架则是一个应用的体系结构,是一种或多种设计模式和代码的混合体虽然它们有所不同,但却共同致力于使人们的设计可以被重用,在思想上存在着统一性的特点,因而设计模式的思想可以在框架设计中进行应用。

  • 架构与设计模式关系

    两者的关系也是很好区分的,设计模式主要是针对单一问题的解决方法,范畴比较小,而架构是高层次的针对体系结构的一种设计思路,范畴比较大。可以这么说,一个架构中可能会出现多个设计模式来解决多种架构中的问题。

  • 总结

    通过上面的分析,我们能够知道他们之间的区别还是有很多,首先架构应该是一个范畴最大的概念,是最高层次的设计。一个架构设计中可能会用到多个框架和多个设计模式;而框架是针对共性抽象出来的半成品,这里面可能包含着多个设计模式;而设计模式就是解决单一问题的设计思路和解决方法。所以我们在做一个项目的时候首先出来的应该是架构,是对整个问题的一个总体上的设计,之后再会考虑运用什么样的框架和设计模式来实现我们的架构;当然,只使用框架和设计模式中的一种也是经常遇到的。

8.分析如下 MVC 架构模式、 MVP 架构模式、 MVVM 架构模式,说明它们在演化过程中分别解决了什么问题?

image-20231222171523876

ChatGPT4:

在软件设计领域,MVC、MVP和MVVM是三种流行的架构模式,用于分离关注点,提高应用程序的可维护性和可扩展性。下面是这三种模式的分析,以及它们在演化过程中解决的问题:

  1. MVC (Model-View-Controller):
    • 问题解决: MVC最初被引入是为了将用户界面(UI)从业务逻辑中分离出来。它允许视图独立于模型变化,使得用户界面可以更容易地修改,而不影响底层的业务逻辑。控制器作为模型和视图之间的中介,处理用户输入并决定视图显示。
    • 演化动机: 但在MVC中,视图和控制器之间仍然存在紧密的耦合,因为视图直接监听模型的变化,控制器也直接更新视图。
  2. MVP (Model-View-Presenter):
    • 问题解决: MVP模式是对MVC的一个改进,它将控制器替换为了Presenter。在MVP中,视图更加被动,它不直接监听模型的变化,而是将所有用户交互转发给Presenter。Presenter则处理这些交互,操作模型,并更新视图。
    • 演化动机: MVP解决了MVC中视图与模型之间耦合过强的问题,通过Presenter使得视图不必了解模型的复杂性,从而进一步分离了视图和业务逻辑。
  3. MVVM (Model-View-ViewModel):
    • 问题解决: MVVM是对MVP的进一步演化。在MVVM中,ViewModel承担了Presenter的职责,并通过数据绑定与视图相连接。ViewModel将视图的状态和行为抽象化,而视图通过声明性数据绑定反映这些状态和行为,从而最小化视图逻辑。
    • 演化动机: MVVM的引入主要是为了简化用户界面的动态更新问题。随着富客户端应用的增长,需要一种方式来更方便地更新UI元素以响应底层数据模型的变化。数据绑定允许自动更新UI元素,这减少了手动操作DOM或视图元素的需要,并使得视图模型可以独立于视图操作,进一步提升了开发效率和可测试性。

总的来说,MVC、MVP和MVVM架构模式在演化过程中逐渐减少了视图与业务逻辑之间的耦合,提高了分离关注点的效果,并使得开发者能够更容易地构建和维护复杂的用户界面。

补充知识:

MVC

在这里插入图片描述

  1. View 传送指令到 Controller
  2. Controller 完成业务逻辑后,要求 Model 改变状态
  3. Model 将新的数据发送到 View,用户得到反馈

所有通信都是单向的

MVP

img

  1. 各部分之间的通信,都是双向的。
  2. View 与 Model 不发生联系,都通过 Presenter 传递。
  3. View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

MVVM

在这里插入图片描述

MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。

软件建模详细设计与设计模式

一、单选题

1.哪种设计原则要求面向接口编程,而不要面向实现编程?©

A.开闭原则

B.里氏替换原则

C.依赖倒置原则

D.接口分离原则

2.哪种设计原则要求没有直接关系的类就不能直接相互调用?(B)

A.里氏替换原则

B.迪米特法则

C. 依赖倒置原则

D.开闭原则

3.下面哪个不是发现类的方法?©

A. CRC方法

B.用例驱动法

C.头脑风暴

D.公共类模式法

4.子类组合来自超类的特征,并重载部分继承来的特征,该继承称为什么?©

A.扩展继承

B.方便继承

C.限制继承

D.以上都不是

5.下面哪一个操作符用于定义条件片段?©

A. opt

B. para

C. alt

D. loop

二、判断题

1.单例模式属于设计模式的行为模式类别。(×)

2.适配器模式可以解决不同模块的类接口转换问题。(√)

3.桥接模式是一种用于把抽象部分与实现部分解耦的设计模式。(√)

4.责任链模式要求请求发送者与多个请求处理者直接交互。(×)

5.中介者模式的动机用于降低多个对象之间存在较复杂的关系。(√)

6.处于相同状态的同类的不同对象对同一事件的反应往往是一样的,而处于不同状态的同一对象则对同一事件会做出不同反应。(√)

7.只要将包中元素的可见性设为公共的,则其他包就可以访问它。(×)

8.聚合与泛化都是面向对象系统支持功能复用的强大技术。(×)

9.在UML构件图中,需要定义消息来描述构件之间的联系。(×)

10.所有对象都通过类来描述,所有类都具有对象。(×)

补充:

6.处于相同状态的对象对同一事件具有同样方式的反应,所以当给定状态下的多个对象当接受到相同事件时会执行相同的动作,例如:当一个在线视频播放器处于"播放中"状态时,对于"暂停"按钮的点击事件,所有这类播放器对象都会执行相同的动作,即暂停当前视频。无论哪个播放器实例,只要它正在播放视频,点击"暂停"按钮都会导致视频停止播放。然而处于不同状态下的对象会通过不同的动作对同一事件做出不同的反应。例如,当自动答复机处于处理事务状态或空闲状态时会对取消键做出不同的反应。

7.虽然将类或成员的可见性设为公共(public)可以让其他包中的类访问这些元素,但这并不是唯一的条件。其他包中的类还需要正确地导入包含公共元素的包。

8.这道题网上搜出来都是对的,答案给的错,后面再看看吧。

10.所有对象都是由类来描述的,这是正确的;但不是所有类都具有对象实例。有些类可能从未被实例化,尤其是抽象类和工具类(可能只有静态方法和成员)。

三、填空题

(状态机图)通过对对象的各种状态建立模型来描述对象随时间变化的动态行为,并且它是以独立的对象为中心进行描述的。

在UML类图中,类用矩形图符来表示,这个矩形由3个部分组成,分别是类型名、(属性)和操作。

UML中的交互图包括顺序图和(通信图)。

UML中顺序图表示为二维图,纵向是对象,横向代表参与交互对象之间的(消息)。

状态机图由对象的状态和连接这些状态的(转换)组成。

UML 建模机制中,对模型的组织是通过 (包) 来实现的。

在类关系中,泛化表达的是 (一般与特殊) 关系,聚合表达的是 (部分与整体) 关系。

接口用于描述类或者组件的一个服务的操作集。接口定义 (一组操作) ,但不定义 (操作的实现 )。

考察交互能够发现类中的方法,顺序图和通信图中的每一条消息,都必须有目标对象的一个 (操作) 为其服务。

(构件图 )表示构件和构件间的接口和依赖关系来表示设计元素的实现。 (部署图) 表示运行时的计算资源的物理布置。 (包图) 由包以及包之间的关系组成。

1.客户数据访问功能模块为了实现将TXT 或 Excel文件中的客户信息输入到数据库中,需要进行数据格式转换。在客户数据访问类(CustomerDAO)中,将调用各外部数据源的转换类方法来实现格式转换,其模块设计类如下:

1)该设计是否满足开闭原则、里氏代换原则和依赖倒置原则?

2)若不满足,请给出满足这些原则的设计类图。

image.png

不满足开闭原则,里氏代换原则、依赖倒置原则。

如果需要添加新的数据格式转换器,比如一个用于CSV文件的转换器,需要修改CustomerDAO类。

图中没有显示转换器的共同超类或接口,要符合里氏代换原则,TXTDataConverterExcelDataConverter都需要继承自定义了readFile()方法的共同接口或超类。

依赖倒置原则要求基于抽象类编程,不依赖具体类编程。CustomerDAO直接依赖于具体的转换器类,这违反了依赖倒置原则。

2)

  1. 创建一个名为DataConverter的接口,该接口定义了一个readFile()方法。
  2. TXTDataConverterExcelDataConverter类实现DataConverter接口。
  3. 修改CustomerDAO类,使其仅依赖于IDataConverter接口。

在这个设计中,CustomerDAO不再直接依赖于具体的转换器类,而是依赖于DataConverter接口。这样,无论是添加新的数据转换器类,还是替换现有的转换器类,都不需要修改CustomerDAO类的代码,满足了开闭原则。同时,任何实现了DataConverter接口的类都可以被CustomerDAO使用,满足了里氏替换原则。最后,因为依赖关系已经从具体的类转移到了接口,也就满足了依赖倒置原则。

在这里插入图片描述

2.分析如下视频服务程序代码,该编程设计存在什么局限?可采取什么设计原则完善该程序设计?给出完善后设计类图及其java代码程序。

public class VideoUserService {
    public void serveGrade(String userType) {
        if ("VIP用户".equals(userType)) {
            System.out.println("VIP用户,视频1080P蓝光");
        } else if ("普通用户".equals(userType)) {
            System.out.println("普通用户,视频720P超清");
        } else if ("访客用户".equals(userType)) {
            System.out.println("访客用户,视频480P高清");
        }
    }
}

用户类型(VIP用户、普通用户、访客用户)直接硬编码在方法中,这种方式在添加新用户类型时需要修改原有代码,违反了开闭原则,扩展性和可维护性较差。

采用开闭原则完善程序设计。

设计类图:

在这里插入图片描述

interface IVideoUserService {
    void definition();

    void advertisement();
}

class GuestVideoUserService implements IVideoUserService {
    public void definition() {
        System.out.println("访客用户,视频480P高清");
    }

    public void advertisement() {
        // 访客用户的广告逻辑
    }
}

class OrdinaryVideoUserService implements IVideoUserService {
    public void definition() {
        System.out.println("普通用户,视频720P超清");
    }

    public void advertisement() {
        // 普通用户的广告逻辑
    }
}

class VipVideoUserService implements IVideoUserService {
    public void definition() {
        System.out.println("VIP用户,视频1080P蓝光");
    }

    public void advertisement() {
        // VIP用户的广告逻辑
    }
}

class VideoUserService {
    private IVideoUserService userService;

    public VideoUserService(IVideoUserService userService) {
        this.userService = userService;
    }

    public void serve() {
        userService.definition();
        userService.advertisement();
    }
}

// 测试代码
public class VideoUserServiceTest {
    public static void main(String[] args) {
        IVideoUserService guestUser = new GuestVideoUserService();
        IVideoUserService ordinaryUser = new OrdinaryVideoUserService();
        IVideoUserService vipUser = new VipVideoUserService();

        VideoUserService guestService = new VideoUserService(guestUser);
        VideoUserService ordinaryService = new VideoUserService(ordinaryUser);
        VideoUserService vipService = new VideoUserService(vipUser);

        guestService.serve();
        ordinaryService.serve();
        vipService.serve();
    }
}

运行结果:

image-20231224232640432

3.分析如下设计类模型存在什么局限?应采取什么设计原则完善该设计?给出完善后设计类图,并实现其代码。

image.png

Driver 类直接依赖于 Benz 类,如果需要在不同类型的车辆之间切换,Driver 类需要进行修改,违反开闭原则,灵活性差。

采取开闭原则和依赖倒置原则。

改进后的设计类图:

改进后的设计类图应该包含以下部分:

  • 一个 Car 接口,定义 run 方法。
  • Benz 类实现 Car 接口。
  • Driver 类有一个 drive 方法,它接受 Car 类型的参数。

如果需要添加一个新的汽车品牌,比如 BMW,只需要创建一个新的 BMW 类实现 Car 接口,无需修改 Driver 类。这样使得系统更加灵活和易于维护。

// Car接口
interface Car {
    void run();
}

// Benz类实现Car接口
class Benz implements Car {
    public void run() {
        System.out.println("Benz is running.");
    }
}

// Driver类
class Driver {
    public void drive(Car car) {
        car.run();
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Driver driver = new Driver();
        Car benz = new Benz();
        driver.drive(benz);
    }
}

运行结果:
在这里插入图片描述

5.解释静态模型、交互模型和状态机模型的主要特点和互补特征。

答:静态模型描述系统的静态结构,包括类、类的内部结构和类之间的关系,采用类图建模。交互模型描述系统中对象的交互,采用顺序图和通信图建模。状态机模型描述对象在其生命周期中的状态的动态变化,采用状态机图建模。

这三个模型提供了不同但互补的观点,通常基于相同的元素建模。静态视图显示存在于系统中的元素种类,交互模型确保组成元素能够协作完成所需要的系统功能,状态机模型则为类的进化定义了框架,并定义了交互和静态模型必须遵守的对类状态的约束。

6.什么是类图?类图里有什么元素?

答:类图对系统的静态结构建模,表示不同的实体(人、事物和数据)是如何彼此相关联起来的。类图主要由类和接口、类的内部结构、类与类之间的关系构成。

7.类之间的关系有哪些?举例描述这些关系。

答:类之间存在依赖关系、关联关系、泛化关系和实现关系。另一种说法,类之间存在关联、泛化和聚合关系。

8.顺序图和通信图有哪些区别和联系?

答:顺序图和通信图都是对交互的建模,展示对象之间的交互。顺序图与通信图语义等价,可相互转换。

顺序图强调消息的时间顺序,展示对象之间随时间发生的交互。通信图强调对象间的连接关系,强调交互的语境和参与交互的对象的整体组织,消息的时间顺序使用序列号表示。顺序图按照时间顺序布图,通信图按照空间组织布图。

9.什么是抽象类?什么是接口?它们之间有什么区别?

答:抽象类指不具有实例的类,其作用是为其它类描述它们的公共属性和行为。接口定义一组操作,不定义操作的实现。

抽象类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象,接口是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。抽象类能提供一些操作的部分实现,接口不实现任何操作。抽象类体现一种继承关系,接口仅仅是契约关系。

10.计算机包括主板、 CPU、内存等部件,请确定它们之间的关系并画出类图。人体包括头、躯干、四肢等部分,请确定它们之间的关系并画出类图。前面两问中的两种关系相同吗?为什么?

答:两种关系不同,计算机和主板、 CPU、内存之间是聚合关系,人体和头、躯干、四肢之间是复合关系。

image-20231225120415889

image-20231225120435825

11.在一个银行系统中,银行可以拥有多个账户,银行可以拥有多个客户,一个客户可以开设多个账户,一个账户可以有多个持有者,可以开户、注销账户、存钱、取钱、转账、查询交易记录。请创建“取钱”的顺序图和“存钱”的通信图。

答:“取钱”的顺序图如下:

在这里插入图片描述

“存钱”通信图如下:

在这里插入图片描述

12.请画出烧水壶的状态机图。

image-20231225120809140

13.银行 ATM 系统可以处理登录、存款、取款、转账、查询业务。请创建该系统的构件图。

image-20231225120909320

14.针对如下民政服务系统的婚姻登记功能设计类图,如何采用饿汉式单例模式实现Java程序编写,并在主程序中输出消息反馈。

image.png

class MarriageRegister {

    // 私有静态实例,在类加载时创建
    private static final MarriageRegister instance = new MarriageRegister();

    // 私有构造方法,防止外部通过new创建多个实例
    private MarriageRegister() {
        // 初始化操作
    }

    // 公有静态方法,返回唯一实例
    public static MarriageRegister getInstance() {
        return instance;
    }

    // 公有方法,输出消息
    public void showMessage() {
        System.out.println("Marriage registration is successful.");
    }
}

public class Client {

    public static void main(String[] args) {
        // 获取MarriageRegister的单例实例
        MarriageRegister register = MarriageRegister.getInstance();

        // 输出消息
        register.showMessage();
    }
}

运行结果:
在这里插入图片描述

15.分析下面设计类图如何解决新能源汽车的发动机接口?给出Java程序实现该设计功能。

在这里插入图片描述

// Motor接口
interface Motor {
    void drive();
}

// 电动电机类
class ElectricMotor {
    public void electricDrive() {
        System.out.println("Electric Motor drive.");
    }
}

// 光电电机类
class OpticalMotor {
    public void opticalDrive() {
        System.out.println("Optical Motor drive.");
    }
}

// 电动电机适配器
class ElectricAdapter implements Motor {
    private ElectricMotor emotor;

    public ElectricAdapter() {
        emotor = new ElectricMotor();
    }

    public void drive() {
        emotor.electricDrive();
    }
}

// 光电电机适配器
class OpticalAdapter implements Motor {
    private OpticalMotor omotor;

    public OpticalAdapter() {
        omotor = new OpticalMotor();
    }

    public void drive() {
        omotor.opticalDrive();
    }
}

// 读取XML配置文件
class ReadXML {
    // 这里提供一个示例方法,用于模拟从XML配置中获取电机对象
    public static Object getObject() {
        // 这里可以根据实际情况读取XML配置,实例化不同的Motor
        // 以下代码仅作为示例
        return new ElectricAdapter(); // 或者 return new OpticalAdapter();
    }
}

public class MotorAdapterTest {
    public static void main(String[] args) {
        // 假设ReadXML.getObject()方法返回一个Motor类型的对象
        Motor motor = (Motor) ReadXML.getObject();
        motor.drive();
    }
}

运行结果:
image-20231224152610322

16.分析如下女士皮包选购功能类图设计如何应用桥接模式?如何编写Java程序实现该功能。

在这里插入图片描述

// Color接口及其具体实现
interface Color {
    String getColor();
}

class Yellow implements Color {
    public String getColor() {
        return "yellow";
    }
}

class Red implements Color {
    public String getColor() {
        return "red";
    }
}

// Bag抽象类及其具体实现
abstract class Bag {
    protected Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract String getName();
}

class HandBag extends Bag {
    public String getName() {
        return "HandBag";
    }
}

class Wallet extends Bag {
    public String getName() {
        return "Wallet";
    }
}

// BagManage类来展示如何使用桥接模式
public class BagManage {
    public static void main(String[] args) {
        // 创建具体实现化角色
        Color yellow = new Yellow();
        Color red = new Red();

        // 创建扩充抽象化角色,并桥接具体实现化角色
        Bag handBag = new HandBag();
        handBag.setColor(yellow); // 设置黄色

        Bag wallet = new Wallet();
        wallet.setColor(red); // 设置红色

        // 操作
        System.out.println("The " + handBag.getName() + " is " + handBag.color.getColor());
        System.out.println("The " + wallet.getName() + " is " + wallet.color.getColor());
    }
}

运行结果:
image-20231224153833943

17.分析如下请假条审批模块功能类图如何应用责任链模式设计?如何编写Java程序。

image.png

// 领导者是抽象处理者
abstract class Leader {
    private Leader next;

    public void setNext(Leader next) {
        this.next = next;
    }

    public Leader getNext() {
        return next;
    }

    // 抽象处理请求的方法
    public abstract void handleRequest(int LeaveDays);
}

// 具体处理者1:班主任
class ClassAdviser extends Leader {
    @Override
    public void handleRequest(int LeaveDays) {
        if (LeaveDays <= 2) { // 班主任可以批准最多2天的请假
            System.out.println("班主任批准了 " + LeaveDays + " 天的请假。");
        } else if (next != null) {
            next.handleRequest(LeaveDays);
        }
    }
}

// 具体处理者2:系主任
class DepartmentHead extends Leader {
    @Override
    public void handleRequest(int LeaveDays) {
        if (LeaveDays <= 5) { // 系主任可以批准最多5天的请假
            System.out.println("系主任批准了 " + LeaveDays + " 天的请假。");
        } else if (next != null) {
            next.handleRequest(LeaveDays);
        }
    }
}

// 具体处理者3:院长
class Dean extends Leader {
    @Override
    public void handleRequest(int LeaveDays) {
        if (LeaveDays <= 10) { // 院长可以批准最多10天的请假
            System.out.println("院长批准了 " + LeaveDays + " 天的请假。");
        } else {
            System.out.println("请假请求 " + LeaveDays + " 天被拒绝。");
        }
    }
}

// 客户端类
public class LeaveApprovalTest {
    public static void main(String[] args) {
        // 设置责任链
        Leader teacher1 = new ClassAdviser();
        Leader teacher2 = new DepartmentHead();
        Leader teacher3 = new Dean();

        teacher1.setNext(teacher2);
        teacher2.setNext(teacher3);

        // 发起请求
        teacher1.handleRequest(8); // 这个请求将由院长处理
    }
}

18.分析如下“房地产交流”模块功能类图如何应用中介者模式设计?给出Java程序。

在这里插入图片描述

import java.util.ArrayList;
import java.util.List;

// 中介者接口
interface Medium {
    void register(Customer member);

    void relay(String from, String ad);
}

// 房地产中介
class EstateMedium implements Medium {
    private List<Customer> members = new ArrayList<>();

    @Override
    public void register(Customer member) {
        if (!members.contains(member)) {
            members.add(member);
            member.setMedium(this);
        }
    }

    @Override
    public void relay(String from, String ad) {
        for (Customer member : members) {
            if (!member.getName().equals(from)) {
                member.receive(from, ad);
            }
        }
    }
}

// 客户类
abstract class Customer {
    protected Medium medium;
    protected String name;

    public Customer(String name) {
        this.name = name;
    }

    public abstract void send(String ad);

    public abstract void receive(String from, String ad);

    public String getName() {
        return name;
    }

    public void setMedium(Medium medium) {
        this.medium = medium;
    }
}

// 卖方类
class Seller extends Customer {
    public Seller(String name) {
        super(name);
    }

    @Override
    public void send(String ad) {
        System.out.println("Seller [" + this.name + "] sends message: " + ad);
        medium.relay(this.name, ad);
    }

    @Override
    public void receive(String from, String ad) {
        System.out.println("Seller [" + this.name + "] received message from " + from + ": " + ad);
    }
}

// 买方类
class Buyer extends Customer {
    public Buyer(String name) {
        super(name);
    }

    @Override
    public void send(String ad) {
        System.out.println("Buyer [" + this.name + "] sends message: " + ad);
        medium.relay(this.name, ad);
    }

    @Override
    public void receive(String from, String ad) {
        System.out.println("Buyer [" + this.name + "] received message from " + from + ": " + ad);
    }
}

// 中介者模式演示
public class MediatorPattern {
    public static void main(String[] args) {
        Medium medium = new EstateMedium();
        Customer seller = new Seller("Alice");
        Customer buyer = new Buyer("Bob");

        medium.register(seller);
        medium.register(buyer);

        seller.send("House for sale!");
        buyer.send("Looking for a house!");
    }
}

运行结果:
image-20231224174229978

用户界面设计

单选题

1.在信息系统中,下面哪项不是用户界面功能?(C)

A.功能执行

B.状态查看

C.数据存取

D.输入/输出

2.下面哪项不在界面布局元素范围中? (B)

A.菜单

B.导航关系

C.按钮

D.列表

3.下面哪种页面结构适合电商Web系统? ©

A.线性结构

B.分层结构

C.网络结构

D.以上均可

4.新闻类Web系统页面导航一般采用哪种方式? (D)

A.水平栏目导航

B.垂直栏目导航

C.混合栏目导航

D.页面内容导航

5.下面哪项不属于界面交互流程设计的步骤? (C)

A.任务确定

B.场景梳理

C.界面布局

D场景流程添加

二、判断题

1.信息系统的功能是通过用户与系统界面交互来实现的。(√)

2.人的视觉规律是以中心为重点向四周发散。 ( ⅹ )

3.在详细界面设计前需要进行系统原型设计。( √ )

4.输入数据格式校验是通过执行检查程序来实现的。( √ )

5.页面的数据列表可以打印输出。 ( ⅹ )

三、填空题

为减少用户记忆负担,在界面上可以给出场景导引、默认值、(历史信息呈现)等提示。(或者填下拉列表值 / 快捷方式 / 逐次推进的提示方式 )

用户界面设计一般包括界面结构设计、界面交互设计、界面导航设计、界面视觉设计和(界面布局设计)。

Web页面导航主要有水平栏目导航、垂直栏目导航、混合栏目导航和(页面内容导航)。

在移动App页面布局设计中,需要对页面信息内容、页面主题内容、用户行为心理和(用户功能操作)进行整体考虑。

在手机App页面布局设计中,页面可以分为背景层、内容层、悬浮层和(弹出层)。

1.用户界面设计需要遵循哪些基本原则?

答:1) 用户能有效控制系统, 2) 减轻用户记忆负担, 3) 保持界面一致性, 4) 界面美观与实用, 5)界面客户化与个性化。

2.用户界面输入需要考虑解决哪些问题?

答:用户界面输入需要解决:

1)如何定位输入控件, 2)如何确定输入顺序, 3)如何验证输入数据是否符合规则, 4)如何防范错误输入操作等。

3.Web 页面结构设计与移动 App 界面结构设计有哪些异同?

答:Web 页面结构设计与移动 App 界面结构设计都应符合用户界面设计通用的设计原则与规范。它们的不同之处在于 Web 页面结构设计主要采用网络结构, App 界面结构设计主要采用层次结构。

4.Web 页面输出有哪些形式?

答:在 Web 系统中,页面数据输出有多种实现形式,它可以是数据列表输出、数据统计图输出、数据报表输出等形式。

5.用户界面交互设计主要包括哪些方面?

答:用户界面交互设计主要包括功能任务、交互场景、交互流程、交互方式、 交互点、视觉流、动效等方面设计。

6.针对一个在线点餐外卖手机 App 软件,采用界面原型工具给出该系统的如下 GUI 界面设计。

1)移动 App 总体页面结构设计

image-20231225123524769

2)移动 App 典型功能的页面布局设计

image-20231225123559797

3)移动 App 页面导航设计

image-20231225123635752

image-20231225123654923

4)移动 App 页面功能的交互设计

image-20231225123717164

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王翊珩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值