[架构之路-252]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 分析VS设计、设计层次(架构、高层、详细); 界面设计、结构化设计(高内聚低耦合)和面向对象设计(23种设计模式)

目录

一、什么是设计?

1.1 什么是设计

1.2 设计的种类

1.3 设计与分析的区别

二、什么是软件设计?

2.1 概述

2.2 软件工程中的软件设计种类:根据宏观到微观分

(1)软件架构设计(层次划分、模块划分、职责分工):

(2)软件高层设计、概要设计(功能模块的接口与协作细节):

(3)软件详细设计(模块内具体实现方式):

2.3 软件工程中的软件设计种类:根据目标对象分

2.4 软件设计的目的

三、常见的软件设计方法

3.1 界面设计

3.2 结构化设计:高内聚与低耦合

3.2.1 内聚类型

3.2.2 耦合类型

3.3 面向对象设计:23种设计模式

3.3.0 面向对象设计的目的

3.3.1 设计过程

3.3.2 面向对象设计的原则

3.3.3 23种设计模式

3.3.4 设计模式与设计原则的区别


一、什么是设计?

1.1 什么是设计

设计,指“把一种设想通过合理的规划、周密的计划、通过各种方式,表达出来的过程”。人类通过劳动改造世界,创造文明,创造物质财富精神财富,而最基础、最主要的创造活动是造物。设计便是造物活动所进行的预先计划,可以把任何造物活动计划技术和计划过程理解为设计。

设计是指制定并实现一个有目的的方案或计划的过程,它涉及各种领域,包括工业设计、建筑设计、图形设计、网页设计、软件设计等。

在每个领域中,设计的目的是解决一个问题或满足一个需求,并在达到这个目的的同时创造出独特的、有益的、有美感的方案或产物。

“Design”(设计)是指为了达到特定目标满足特定需求而进行计划创造组织的过程。在软件开发领域中,设计是指在软件开发生命周期的早期阶段,通过定义系统的结构、组件、接口和算法等,来指导软件系统的实现过程。

设计的一般概念可以概括为以下几个方面:

  1. 目的和需求:设计的起点通常是一个具体的目的或需求,例如一个产品要解决的问题、一个建筑需要满足的功能要求等。

  2. 分析和研究:在明确了设计的目的和需求后,设计师需要进行各种分析和研究,例如市场调研、用户需求分析、技术可行性研究等。

  3. 创意和概念:在分析和研究的基础上,设计师开始进行创意和概念的生成,包括脑暴、草图、模型等。

  4. 执行和实现:通过各种工具和技术,设计师将创意和概念转化为具体的设计方案,并最终实现出产物。

  5. 评价和改进:设计完成后需要进行评价和改进,以确保设计的品质和可持续性。

设计是一个复杂而重要的过程,它需要设计师具备多方面的能力,包括创意、分析、执行、沟通和团队协作等。好的设计不仅能够解决问题和满足需求,还能够为人们带来美感、舒适和愉悦,并使社会变得更加美好。

备注:

在设计过程中,计划、创造和组织是三个核心的活动。

它们在设计过程中紧密相连,相互支持,以确保有效的设计结果

  1. 计划(Plan):计划是指在设计中制定和安排适当的行动步骤和策略的过程(设计流程、设计过程)。在设计开始之前,需要仔细考虑和规划设计的目标、范围、时间、资源和预期结果等。计划阶段的关键活动包括需求分析、目标设定、范围定义、资源评估和时间规划等。通过良好的计划,可以明确设计的目标,为后续的创造和组织阶段提供清晰的指导。

  2. 创造(Create):创造是指根据设计的目标和计划,创造和构思:新的概念、解决方案和设计元素的过程。在创造阶段,设计师会使用各种创造性的技术和方法,如头脑风暴、草图、原型和实验等,来发现新的设计思路和解决方案。创造的目标是通过创新和想象力,提供满足需求的设计解决方案。

  3. 组织(Organize):组织是指将设计的各个组成部分整合并形成有机的结构和规划的过程。在组织阶段,设计师将根据创造的结果,对设计元素和组件进行分类、分配和组合。这包括定义类和接口的关系、模块的组织、数据的结构和组织等。组织的目标是确保设计的一致性、合理性和可维护性,以及满足设计的整体目标和需求。组织是把各种元素构建成一个有机的系统最重要的环节。

计划、创造和组织是设计过程中连续进行的活动,每个阶段都对下一个阶段产生影响。

  • 目标通过良好的计划,可以确定:设计的目标和约束条件
  • 方案:通过创造,可以发现创新的设计解决方案
  • 整合:通过组织,可以将设计元素整合成一个有机的结构

这些活动相互交互,相互支持,为设计提供有效的指导和实施路径,从而实现设计的目标和提供高质量的设计结果。

1.2 设计的种类

设计涵盖了多个领域和专业,下面是一些常见的设计种类:

  1. 工业设计:工业设计关注产品的外观、功能和用户体验,包括家电、汽车、家具、电子设备等的设计。

  2. 建筑设计:建筑设计涉及建筑物的规划、结构、空间布局和外观设计,包括住宅、商业建筑、公共建筑等。

  3. 平面设计:平面设计包括印刷品、海报、标志、名片、杂志排版等的设计,它主要关注于图像、文字、排版和传达信息的方式

  4. 网页设计:网页设计专注于网站的用户界面和用户体验,包括布局、色彩、图形、导航等的设计,旨在提供良好的用户体验。

  5. 用户体验设计(UX 设计):用户体验设计关注用户与产品或服务的交互过程,设计师通过研究用户需求和行为,优化产品的可用性、易用性和用户满意度。

  6. 用户界面设计(UI 设计):用户界面设计着重于产品或应用程序的外观和交互设计,包括界面元素、图标、按钮和页面布局等。

  7. 视觉设计:视觉设计关注视觉元素的组合和创意,包括色彩、排版、图像和图形设计等,用于传达特定的视觉信息。

  8. 品牌设计:品牌设计包括标志设计、企业形象设计和品牌战略,旨在塑造和传达一个品牌的特征、价值和个性。

此外,还有动画设计、服装设计、室内设计、游戏设计等其他领域的设计。每个领域的设计都有其特定的原则、工具和技术,设计师需要根据具体需求和专业知识选择适当的设计方法。

1.3 设计与分析的区别

设计和分析是两个相互关联但不同的概念。

分析(关注What,关注问题域是什么)是一个系统化的过程,旨在对问题或系统进行详细的调查和研究,为决策提供数据和/或信息支持。它通常是针对某个问题进行系统化的调查和分析,以达成确定的目标。分析关注如何分解和解决问题,通常包括定义问题、搜集数据、整理和分析数据、制定解决方案并评估解决方案的效果。例如,在设计自动售货机之前,需要进行市场调研来了解用户需求并分析竞争对手的产品,以确定产品的设计和定位。

设计(关注How,关注目标系统实现方案)是一个创新性的过程,通常涉及解决问题或实现目标的方案或计划的制定和实现。它关注如何创造一个新的、有益的、独特的、具有美感的产物或方案,以满足用户需求,并在设计完成后进行实施。设计是需要主观判断、创造力和创新思维的过程,需要全面考虑产品或系统的功能、样式、外观、用户体验及其他方面的因素,以便最终达到预期的效果。例如,当设计一台新的自动售货机时,设计师需要考虑如何为用户提供一个简单易用的购物体验,并如何使机器看起来美观而高效。

因此,设计和分析涉及不同的方法、技术和过程,但它们经常在设计和开发的各个阶段交替使用,以达成最终的目标。

二、什么是软件设计?

2.1 概述

在软件开发中,设计也是类似的一个过程,它通过系统的分析、规划以及决策等一系列活动,将系统的需求和目标转化为具体的软件设计方案,并通过各种工具和方式来表达这些方案。

软件设计是指在软件开发过程中,根据需求和目标,通过分析、规划和决策等活动,制定系统的整体结构、组件之间的关系和功能实现的具体方案。设计旨在解决问题、满足需求,并确保软件系统的高质量、可扩展性和可维护性。

2.2 软件工程中的软件设计种类:根据宏观到微观分

软件架构设计、软件高层设计和软件详细设计是软件开发中三个重要的设计层次,它们各自关注不同的设计方面,如下所述:

(1)软件架构设计(层次划分、模块划分、职责分工):

确定软件系统的整体结构和组织方式,包括系统的分层、模块划分、框架选择等。系统架构设计关注系统的稳定性、可靠性和可扩展性,以及系统各个组成部分之间的交互和接口。软件架构设计是从系统整体级别出发,通过对系统的组成部分、各部分之间的关系及其所承担的功能等进行梳理和设计,确定系统总体的结构风格、包括框架和组件的分配、接口、数据流动等。软件架构设计的目的是为整个系统提供一个坚实、可靠、高效、稳定和可维护的基础,需要考虑因素包括系统的可用性、可伸缩性、可维护性、可安全性等。关注整体的非功能性需求!!!

(2)软件高层设计、概要设计(功能模块的接口与协作细节):

软件高层设计是在软件架构设计的基础上进行的,它关注的是系统中各个模块和组件的功能细节和交互方式,确定系统各个模块之间的接口方式和合理的协作关系,从而实现系统的预期功能。由于高层设计服务于架构设计,其需要考虑到诸如结构合理、功能完备,以及后期的扩展和调整等目标。关注接口定义,与编程语言无关!!!

(3)软件详细设计(模块内具体实现方式):

软件详细设计是在软件高层设计的基础上进一步细化,关注的是每个模块和组件的实现和具体实现方式,包括数据结构、算法、代码实现等方面的细节问题,其目的是为软件开发的人员提供具有可行性和可实现性的详细设计方案。详细设计涉及到诸如如何编写代码、如何测试代码、如何实现功能等具体实现问题,其层次较为具体化,详细设计直接指导编码实现!与具体的编程语言相关!!!

因此,软件架构设计、软件高层设计和软件详细设计在软件开发的不同阶段发挥着至关重要的作用。一个好的设计方案可以有效地解决软件开发中的复杂性和不确定性,并提高软件的可靠性、可维护性和可扩展性。

2.3 软件工程中的软件设计种类:根据目标对象分

在软件开发中,设计是一个包含多个层次和环节的过程。

它可以涵盖以下几个方面:

  1. 用户界面设计:如果系统需要用户界面来与用户进行交互,设计用户界面是重要的一环。用户界面设计包括界面布局、交互设计、用户体验等。用户界面设计要考虑用户友好性、易用性和可访问性,以提供良好的用户体验。

  2. 软件组件/模块设计/功能模块:针对系统的不同功能,对各个组件进行详细设计。组件设计涉及到组件的功能实现、接口定义、数据结构和算法选择等。组件设计要考虑系统的性能、效率和可重用性,以及与其他组件的协作方式。

  3. 数据库设计:如果系统需要使用数据库进行数据存储和管理,设计数据库结构和数据模型是必要的。数据库设计包括表的设计、字段定义、关系建立、约束设置等。数据库设计关注数据的一致性、完整性和安全性,以及数据库的性能和扩展性。

设计是软件开发中的关键环节,它对系统的质量、可维护性和用户满意度具有重要影响。好的设计能够提高系统的可扩展性、灵活性和可维护性,降低开发和维护成本,为系统的成功实施打下基础。

2.4 软件设计的目的

软件设计(Software Design)的主要目的是定义:如何实现软件系统的需求规格,从而使得软件系统可以满足其预定的目标和需求。软件设计关注系统的整体结构、组织和交互方式,从而提供实现所需的结构、算法和数据结构等信息。

以下是软件设计的主要目的:

  1. 实现可靠性:软件设计旨在确保软件系统的可靠性和稳定性,使系统能够在整个生命周期内始终正常运行,并且能够满足用户的功能和性能需求。设计应该考虑到系统的安全性、可靠性、健壮性和容错性等因素。

  2. 提高质量:软件设计的目的是提高软件系统的质量和可维护性。软件设计应该注重良好的结构、设计原则和设计模式的应用,以及清晰的代码和文档。这将有助于减少系统故障、维护成本和开发时间,并提高代码的可读性和重用性。

  3. 降低成本:良好的软件设计可以帮助降低软件系统开发、维护和运营的成本。通过模块化的设计和复用的方法,软件设计可以更好地组织代码、提高代码的可读性和重用性,从而降低开发和维护成本。

  4. 可扩展性:软件设计应该提供可扩展性,使得软件系统能够适应未来的需求变化和业务扩展。软件设计应该具有高内聚性和低耦合度,以便为将来的变化提供灵活的规划和组织。

  5. 易用性:良好的软件设计应该考虑到用户体验,使得软件系统易于使用和学习。设计应该关注用户界面、工作流程和交互上下文等因素,从而提高系统的易用性、可用性和用户满意度。

综上所述,软件设计是实现软件系统目标的基础,它应该关注系统的整体结构、组织和优化,从而提供一种高质量、易于维护和可扩展的方法。通过良好的软件设计,能够提高软件系统的可靠性、可维护性、扩展性和易用性,同时降低开发和维护成本。

三、常见的软件设计方法

常见的软件设计方法包括界面设计、结构化设计和面向对象设计。

这些设计方法都有自己的特点和适用场景。根据具体的软件项目和需求,可以选择合适的设计方法,或者结合不同的设计方法来设计软件系统。重要的是根据项目的特点和目标,确保设计方案能够满足系统的需求和目标,并提供可维护、可扩展和高效的软件系统。

3.1 界面设计

界面设计关注的是用户与软件系统之间的交互界面,包括用户界面设计用户体验设计

在界面设计中,设计师考虑如何设计直观、易用、美观的用户界面,以及如何优化用户与系统的交互体验。界面设计的目标是使用户能够轻松地与软件系统进行交互,并提供良好的用户体验

3.2 结构化设计:高内聚与低耦合

结构化设计是一种基于模块化的设计方法,旨在建立软件系统的结构框架组织方式。在结构化设计中,系统被分解为多个模块,每个模块负责特定的功能,模块之间通过明确定义的接口进行通信。结构化设计的目标是提供可靠、可维护和易于理解的软件结构,以便开发人员可以分工合作、改进和维护软件。

3.2.1 内聚类型

内聚(Cohesion)是软件设计中一个重要的概念,指的是模块或组件内部元素相互关联程度的度量。内聚性高意味着模块内部的元素彼此相关联,共同完成一个明确的功能或任务,而内聚性低则表示模块内部的元素关联性较弱,功能不够集中。根据元素之间的关联程度不同,内聚性可分为以下几种类型:

  1. 功能内聚(Functional Cohesion):模块内的元素共同完成一个明确的功能或任务,各个元素之间相关性紧密,协同工作完成特定的功能。例如,一个计算器模块包括加法、减法、乘法和除法等函数,这些函数在功能上紧密相关,代表了功能内聚。

  2. 顺序内聚(Sequential Cohesion):模块内的元素按照一定的步骤或顺序进行操作,前一个元素的输出作为后一个元素的输入,形成一个操作序列。例如,一个文件处理模块包括打开文件、读取文件内容、处理数据和保存结果等步骤,这些步骤由于其操作顺序而形成顺序内聚。

  3. 通信内聚(Communicational Cohesion):模块内的元素之间通过共享数据进行通信,它们共同处理相关的数据。例如,一个邮件发送模块包括输入收件人、输入邮件内容、验证发送权限和发送邮件等元素,这些元素通过共享邮件内容进行通信,代表了通信内聚。

  4. 过程内聚(Procedural Cohesion):模块内的元素执行相似的操作,并且在同一个流程或算法中相关联。例如,一个排序模块包括选择排序、冒泡排序和快速排序等函数,这些函数在相关算法的上下文中执行相似的操作,代表了过程内聚。

  5. 数据内聚(Data Cohesion):模块内的元素对同一数据或数据结构进行操作,它们共同对该数据进行处理。例如,一个学生信息管理模块包括添加学生信息、修改学生信息和删除学生信息等操作,这些操作都是围绕学生信息数据进行的,代表了数据内聚。

  6. 时间内聚(Temporal Cohesion):模块内的元素在同一时间段内执行,并且需要在同一时间段进行调用。例如,一个报告生成模块包括收集数据、处理数据和生成报告等操作,这些操作需要在同一时间段内执行,代表了时间内聚。

不同类型的内聚都对软件设计和开发有不同的影响,高内聚是设计的目标,因为高内聚度通常意味着模块的功能清晰,易于理解、维护和测试。设计时需要根据具体需求和设计目标选择合适的内聚类型。

3.2.2 耦合类型

耦合(Coupling)是软件设计中描述模块或组件之间相互依赖程度的概念。耦合度高表示模块之间的相互依赖程度强,耦合度低表示模块之间的相互依赖程度弱。根据模块之间的相互依赖性不同,耦合度可分为以下几种类型:

  1. 无耦合(No Coupling):模块之间没有直接的相互依赖关系,彼此独立存在,并且不共享数据或信息。这是理想的耦合类型,但在实际设计中很难完全实现。

  2. 数据耦合(Data Coupling):模块之间通过共享数据进行通信,一个模块将数据传递给另一个模块。这种耦合方式通常是通过参数传递或共享的全局数据来实现的。

  3. 标记耦合(Stamp Coupling):模块之间通过标记或标识进行通信,一个模块将标记传递给另一个模块,接收方根据标记来识别并处理相应的操作。这种耦合方式通常需要模块之间有共同的标记定义。

  4. 控制耦合(Control Coupling):一个模块直接控制另一个模块的执行流程,通常通过调用另一个模块的方法或函数来实现。这种耦合方式通常需要模块之间有相互调用的关系。

  5. 外部耦合(External Coupling):模块之间通过共享外部实体(如文件、数据库、网络等)进行通信,一个模块通过读取或写入外部实体来与另一个模块进行交互。

  6. 公共耦合(Common Coupling):多个模块共享同一个全局数据或全局变量,它们可能同时读取或同时写入该全局数据。这种耦合方式容易导致模块之间的竞争和潜在的冲突。

  7. 内容耦合(Content Coupling):一个模块直接访问另一个模块的内部数据或内部实现细节,这种耦合方式是最强的,也是应尽量避免的。

降低耦合性是良好软件设计的目标之一。高内聚和低耦合度有助于提高软件的可维护性、可重用性和可测试性。在设计时,应尽量选择低耦合度的设计模式和技术,以减少模块之间的相互依赖,使各个模块能够独立变更和演化。

3.3 面向对象设计:23种设计模式

面向对象设计是一种基于对象和类的设计方法,它通过将系统抽象为对象,并定义对象之间的关系和行为来描述系统的结构和功能。

在面向对象设计中,系统由多个相互协作的对象组成,每个对象拥有自己的属性和方法。面向对象设计的基本原则包括封装、继承和多态,它可以提供代码的重用性、可扩展性和灵活性

3.3.0 面向对象设计的目的

面向对象设计(Object-Oriented Design,OOD)的目的是创建可维护、可扩展、可重用和可理解的软件系统。它使用对象、类、继承、封装、多态等概念和技术来描述和组织软件系统。

以下是面向对象设计的主要目的:

  1. 模块化:面向对象设计将复杂系统分解为小而独立的模块,每个模块都有自己的责任和功能。这种模块化的设计使得系统更易于理解、修改和维护,并且可以促进团队合作和并行开发。

  2. 可扩展性:通过面向对象设计,我们可以通过添加新的类或扩展现有类来轻松地扩展系统的功能。这种灵活性使得系统能够适应变化和新需求的发布,从而保持系统的可用性和竞争力。

  3. 可重用性/可复用性(最核心的目的):面向对象设计通过提供复用的机制(例如继承、组合等)来促进代码的重用。通过复用现有的类、模块或组件,我们可以减少开发时间和成本,并提高系统的质量和稳定性。

  4. 可维护性:面向对象的设计原则鼓励将系统分解为小而简单的部分,每个部分都有清晰的职责和接口。这种清晰的结构和良好的封装使得系统更易于调试、修改和维护,同时减少了错误的传播和影响。

  5. 可测试性:面向对象设计的模块化和封装特性使得软件系统更易于进行单元测试和集成测试。每个对象可以独立测试,而不需要考虑系统的其他部分,从而提高了测试的准确性和效率。

  6. 可理解性:面向对象设计使用类和对象来模拟真实世界的概念,使得系统的设计和实现更易于理解和沟通。面向对象的抽象和封装使得系统的结构和逻辑更加清晰和直观。

通过以上目的,面向对象设计可以帮助开发者构建高质量、可维护和可扩展的软件系统。它提供了一种结构化和面向对象的思维方式,使得软件设计和开发更加可控和可预测。

3.3.1 设计过程

面向对象设计(Object-Oriented Design,OOD)是一种软件设计方法,它以对象和类为基础,通过抽象、封装、继承和多态等概念来描述和组织系统的结构和行为。下面是常见的面向对象设计过程:

  1. 需求分析:在面向对象设计过程中,首先需要对系统的需求进行分析和理解。这包括与系统用户和相关利益相关者进行沟通,了解其需求、期望和业务流程。需求分析的结果将帮助设计者确定系统的功能和特性,并为后续的设计工作提供指导。

  2. 系统设计:在系统设计阶段,设计者需要综合各种因素来制定系统的整体架构。这包括确定系统的模块组织结构、模块之间的关系和交互方式。面向对象设计中,设计者通常会根据需求分析的结果,将系统分解为一系列相互协作的对象和类,确定它们的属性、方法和关系。

  3. 类设计:在类设计阶段,设计者根据系统需求和系统设计的目标,将对象和类进一步细化,并详细定义它们的属性和方法。这包括确定类的成员变量、方法以及它们之间的关系(如继承关系、关联关系、聚合关系等)。类设计要求设计者具备良好的抽象能力和领域知识,以便能够准确地捕捉系统的实体和行为。

  4. 行为设计:在行为设计阶段,设计者将关注对象和类的行为(方法)的具体实现。这包括定义方法的算法、流程和逻辑,以及确定方法之间的调用关系和协作方式。行为设计涉及到应用适当的设计模式和算法来实现系统的功能和需求。

  5. 界面设计:界面设计是面向对象设计过程中的重要一步,它关注用户与系统之间的交互界面。设计者需要创建易于使用、直观和美观的用户界面,以提供良好的用户体验。界面设计涉及到定义用户界面元素、布局、交互方式和视觉风格等。

  6. 测试和验证:在设计过程的各个阶段,测试和验证是必不可少的。设计者需要编写测试用例和测试脚本,以验证设计的正确性和功能的有效性。通过测试和验证,可以及早发现和修复设计中的问题,确保设计的质量和可靠性。

  7. 迭代和优化:面向对象设计是一个迭代的过程,设计者需要不断地从用户反馈和系统运行情况中汲取经验,进行迭代和优化。随着设计的不断演进,设计者可以改善系统的可维护性、可扩展性和性能。

面向对象设计过程是一个逐步细化和迭代的过程,需要设计者综合考虑系统的需求、结构和行为,并应用合适的设计原则和模式。一个好的面向对象设计能够产生可重用、可扩展和易于维护的软件系统。

3.3.2 面向对象设计的原则

面向对象设计(Object-Oriented Design,OOD)的设计原则是一组指导性的原则,旨在帮助设计者创建具有高内聚性和低耦合度的面向对象系统。以下是常见的面向对象设计原则:

  1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该有且只有一个引起它变化的原因。该原则强调每个类应该专注于完成单一的任务或职责,从而提高类的内聚性和可维护性。

  2. 开放封闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。该原则鼓励使用抽象和接口来定义软件实体,以便可以通过扩展来增加功能,而不需要修改已有的代码。

  3. 里氏替换原则(Liskov Substitution Principle,LSP):子类应该能够替换父类并且不会引起错误或异常。该原则要求子类必须能够完全替换其父类,并且保持父类的行为约束,以确保系统的正确性和稳定性。

  4. 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该依赖于它不需要的接口。该原则鼓励将大型接口拆分为更小、更专门化的接口,以便客户端只依赖于它们所需的接口,从而减少依赖关系和耦合度。

  5. 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖于低层模块,二者都应该依赖于抽象。该原则强调模块之间的依赖关系应该通过抽象来实现,而不是直接依赖于具体的实现。

  6. 合成复用原则(Composite/Composition Reuse Principle,CRP):尽量使用对象组合而不是继承来达到复用的目的。该原则鼓励通过组合关系来实现代码的复用,而不是通过继承关系。

  7. 最小知识原则(Least Knowledge Principle,LKP):一个模块(类或对象)应该对其他模块具有最少的了解。该原则要求减少对象之间的直接交互,尽可能减少对象之间的依赖关系,以提高系统的可维护性和灵活性。

这些面向对象设计原则是帮助设计者进行良好的面向对象设计的指导,它们可以提供设计决策的方向,帮助设计者创建可扩展、可维护和高质量的软件系统。这些原则通常用于配合设计模式和其他软件开发实践来实现更好的设计和架构。

3.3.3 23种设计模式

面向对象设计模式是用于解决特定类型软件设计问题的经验总结和最佳实践。

下面列举了一些常见的面向对象设计模式:

  1. 创建型模式:

    • 工厂模式(Factory Pattern)
    • 抽象工厂模式(Abstract Factory Pattern)
    • 单例模式(Singleton Pattern)
    • 建造者模式(Builder Pattern)
    • 原型模式(Prototype Pattern)
  2. 结构型模式:

    • 适配器模式(Adapter Pattern)
    • 装饰器模式(Decorator Pattern)
    • 外观模式(Facade Pattern)
    • 代理模式(Proxy Pattern)
    • 桥接模式(Bridge Pattern)
    • 组合模式(Composite Pattern)
    • 享元模式(Flyweight Pattern)
  3. 行为型模式:

    • 观察者模式(Observer Pattern)
    • 策略模式(Strategy Pattern)
    • 命令模式(Command Pattern)
    • 模板方法模式(Template Method Pattern)
    • 迭代器模式(Iterator Pattern)
    • 访问者模式(Visitor Pattern)
    • 职责链模式(Chain of Responsibility Pattern)
    • 状态模式(State Pattern)
    • 备忘录模式(Memento Pattern)
    • 解释器模式(Interpreter Pattern)

以上仅是一些常见的面向对象设计模式,每个模式都有其独特的应用场景和使用方式。设计者可以根据具体的问题和需求选择合适的模式来解决设计和架构上的挑战。这些设计模式可以提供代码的可重用性、可维护性和可扩展性,并有助于降低系统的耦合度和复杂性。请注意,模式的应用需要根据具体情况进行适当调整,以满足项目的需求。

3.3.4 设计模式与设计原则的区别

面向对象设计原则和设计模式都是用于设计和开发面向对象软件的重要概念,但它们的目的、应用方式和范畴略有不同。

面向对象设计原则是一组通用原则,用于指导面向对象软件设计的实践。这些原则包括单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则、合成复用原则和最小知识原则等,它们指导了如何创建具有高内聚性和低耦合度的面向对象系统。

设计模式则是一种经过验证的解决方案,用于解决特定类型的面向对象设计问题。设计模式由经验总结和最佳实践组成,可以用于实现某些面向对象设计原则的要求。例如,工厂模式用于创建对象实例,符合单一职责和开放封闭原则,而装饰器模式用于给对象动态添加行为,符合开放封闭原则和最小知识原则等。

因此,面向对象设计原则是一种通用的设计规范,它们是指导面向对象软件设计的基本方法,而设计模式则是具体的面向对象软件设计方案。设计原则提供对系统的整体设计的指导,而它们的实现可以通过使用设计模式来实现。

通过遵循面向对象设计原则,我们可以创建高质量的软件系统,而使用设计模式可以使系统更加具有可重用性、可维护性和可扩展性。不同设计原则和设计模式的相互组合可以产生高效的面向对象软件设计方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
软件设计方案 用户界面设计规范 用户界面:又称人机界面,实现用户与计算机之间的通信,以控制计算机或进行用户与计算机之间的数据传送的系统部件。 GUI:即图形用户界面,一种可视的用户界面,它使用图形界面代替正文界面。 本系统坚持图形用户界面(GUI)设计原则,界面直观、对用户透明。用户接触软件后对界面上对应的功能一目了然、不需要多少培训就可以方便地使用本应用系统。 1、界面设计介绍 界面设计是为了满足软件专业标准的需求而产生的对软件的使用界面进行美规范设计分支。 1)软件启动封面设计 应使软件启动封面最终为高清晰度的图像,选用的色彩不宜超过256色,大小多为主流显示器分辨率的1/6大。启动封面上应该醒目地标注制作或支持的公司标志、产品商标、软件名称、版本号、网址、版权声明、序列号等信息,以树立软件形象,方便使用者或购买者在软件启动的时候得到提示。插图宜使用具有独立版权的、象征性强的、识别性高的、视觉传达效果好的图形,若使用摄影也应该进行数位处理,以形成该软件的个性特征。如果是系列软件还将考虑整体设计的统一和延续性。 2)软件框架设计 软件的框架设计要复杂得多。软件框架设计应该简洁明快,尽量少用无谓的装饰,应该考虑节省屏幕空间,各种分辨率的大小,缩放时的状态和原则,并且为将来设计的按钮、菜单、标签、滚动条及状态栏预留位置。设计中将整体色彩组合进行合理搭配,将软件商标放在显著位置,主菜单应放在左边或上边,滚动条放在右边,状态栏放在下边,以符合视觉流程和用户使用心理。 3)软件按钮设计 软件按钮设计应该具有交互性,即应该有3到6种状态效果:点击前鼠标未放在上面时的状态;鼠标放在上面但未点击的状态;点击时状态;点击后鼠标未放在上面时的状态;不能点击时状态;独立自动变的状态。按钮应具备简洁的图示效果,名称易懂,用词准确,能望文知意最好,让使用者产生功能关联反应,群组内按钮应该风格统一,功能差异大的按钮应该有所区别。
范围:CPU上可以识别的代码和数据。全部的代码总和。 要求:从定义开始的设计。完整性,彻底地定义从无开始的整个设计。这是因为软件之软,也是因为硬件平台的多样性和特殊性。 完整把握,从头设计是第一原则。因为软件世界自己并不能统一,还有继续分的趋势。没有根本一致的基础可能是软件的本性。退回到一无所有是处理软件问题的根本。 在这样的视野下,操作系统只是一个部分,一个模块,不同的操作系统任你选择;语言的选择是运行环境的选择(每种语言有每种语言的运行时布局);所谓框架只是“类库+运行环境”的一种构造。 没有对其负载能力、操作强度进行评估前,这些东西(操作系统、语言、框架)还都不能纳入设计规范。 性能:运行过程的收敛(长时间运行的均态)。操作强度设计(串行处理速度),负载能力设计(并发处理的量)。可靠性设计软件问题的3个方面: 1、硬件,软件的操作对象和运行软件的数字系统(CPU系统和数字加速硬件) 2、交互操作(界面),专业界面设计 3、软件调度性能,实时的自动过程(设备控制和自动测量)和用户交互过程(请求服务过程和干预过程;本地交互和远程交互),程控和网络访问的调度(服务器)。 软件项目的3个部分:(把3个阶段由纵向横过来,进行统筹) 分解文档,集成平台,可维护性要求。 软件设计必须有自说明特性。不能对文档产生依赖性。软件代码中合适的地方,需要对文档进行恰如其分说明。原则是,每段代码,每处需要理解的地方,如果和总体架构相关,就要有说明。 软件领域需要简。需要还原软件本来的面目。EDA有泛滥的趋势,软件的各个方面都需要简软件形态、需求分析、文档说明、开发工具等。 需求分析过分强调适应生命周期的变和没有需求分析是一样的。不切实际的面向未来的需求架构的直接结果是软件的复杂和错误百出。 软件只有一个,而观察的视角很多。要采用最适合的观察视角,让软件一目了然。 软件的生成过程和观察过程是两个不同的观念。生成过程又可以区分为:研究过程和工程过程。研究过程可以通过结果,研究报告反映;工程过程则必须采用过程刻画。 软件规范使用的语言一定要有普遍语义,但描述本身具有特殊性;不能强求它的全球唯一。一定要雄视全体,才能选择正确的立足点,这就要求对目前的软件技术有一个了解;要考虑纳入新的发展,那么规范应该分层,把一般的和具体易变的成分分开;要有具体的指导意义,越具体指导意义越大,但通用性则越小。 所谓架构,可能是十分具体应用的代表;不同类别的应用必然有不同的架构软件架构本身是“应用架构”。因此,不能规范具体的架构。到是可以做:应用架构规范的规范。 逻辑架构的特殊性。可以判断,任何一款实用的软件采取的软件逻辑抽象都是别样的,特例的逻辑。否则,软件不可能那么轻快实用。软件逻辑,鬼魅也。而需求分析,必须是现实实用的,而不是同构/仿真的-这似乎是反对象分析的。因为这里强调的是和软件的交互界面,这个界面远远没有反映现实世界的结构。须知,软件强调的是数据处理,是输入输出。否则,就不能达到最简。 可能现实世界的结构映射,最适合的方式是数据库 - 采用纯数据结构进行映射。除此之外,能有更合适的技术吗? 面向对象建模是吗?那么对象又如何与现实世界的对象绑定在一起呢? 这再次表明,在软件技术和需求分析之间有鸿沟。软件技术作为特殊的技术,有它的有限性。也反映了,包含软件应用在内的现实架构已经固定。 如果软件是数据处理,是输入输出,那么软件结构也就可以确定了! 可视、用户操作界面解开了另外的软件世界,因为可视可以代表用户更抽象的逻辑。用户希望操作可视对象,象操作现实对象一样。软件从模拟现实对象的过程中继承了其结构。 工业控制也开启了新的软件世界,因为软件要从分离的输入建立“综合感知”,感知到设备状态,然后做出响应。 软件有其固有的物理属性,也就是计算的量。算法领域,无论算法的论证多么曲折,求得的结果,物软件,总是“早已熟知”的软件。这一区分,是定义软件规范的基石。 算法构造领域是和软件完全不同的领域,算法不是软件。算法类似数学系统。也一如数学系统那样多样。 软件构造。算法总要转软件,这就是软件构造问题。寻址系统,数组。软件把自己的生成作为问题,给算法开辟了新的领域。软件生成,是一个“构造-编译”问题。手工构造,自动编译。语言的发展,是一个软件生成的历史。所谓统一建模,所谓设计模式,其实都是软件生成的问题。 需求分析。需求分析本质上是独立的。所谓OOA,面向对象的建模,把程序构造概念上升到需求分析领域可能是不对的。一个先验的,复杂的难于掌握的限制,只会让人对需求分析望而却步;即使勉强掌握,难求对需求分析的创造性发展。需求分析应该专注于需求分析本身,独立发展,一切为了准确、快捷的分析。 需求分析层次高一些,抽象一些,自由一些,这样可以充分表达需求的本质。反而可以促进更高级别的程序自动生成。 软件生成的历史。软件生成是为了解决人机沟通,让“计算机语言”更接近普通人的思维逻辑。把这种“高级计算机语言”翻译成可以执行的代码,就是软件生成(代码生成)的任务。而软件编制是专业人员的事情,因此语言问题的本质其实不那么重要。须知,经过培训,莫尔司码的电报发报可以比说话的语速还快!因此,计算机语言的前途迷茫;实际上也确实迷茫,历史上语言的层出不穷本身就说明了问题,至今仍然如此。在当今,必须建立这样的观点:语言是因人而异的;面对一个语言的时候,要清醒,首先明确“这是为谁设计的语言”;也就是说,需求分析之前的需求是要明确,让什么人来设计软件,然后为他们选择合适的语言。软件生成除了代码生成,还包括另外一个意思:软件构造。这在前面已经论述过了。只是,这里的软件构造机制已经在语言中奠定了。手工参与的软件构造只是语言给出的构造机制的应用。手工的软件构造就是语言构造机制的复制,产生大量的代码,应付实际问题的量。 立体构造。这里还有一个立体问题,实际问题的构造可能产生立体构造,如同建筑,基本的构件组装出复杂的立体结构。这里是建筑设计师的功劳。可能目前我们在语言层面上混淆不清的关键也在这里,没有区分语言和立体构造的责任。一个趋势是语言本身总是试图包揽建筑师的责任。把立体构造独立出来,带来的问题是:这个构造本身必须能够证明自己是正确的。1)能产生软件2)构造逻辑上正确,确实能解决应用问题。构造本身有一个属性,它有通用性。根本原理是通用的;总体构造本身具有一般性,也就是抽象性、实际问题无关性;局部构件具有通用性。也就是说,这里存在容器和容量的区别,构造是容器,实际问题是装在容器中的量。一个好的容器要能顶住容量的压力;一个好的建筑架构要能满足负载和抗振性要求。而架构本身的承受能力是客观的,只与架构本身有关。这也就是说,架构本身自我构造的,因此也就是科学。可能软件构造本身是澄清问题的工作,明确“容量”的特点,为软件构造的选择提供准确的依据,杀鸡不要用牛刀。实际问题的“容量”很容易测量,因为它反映为应用的规模,流程的流量。(架构是什么?架构是否存在?如果我们所说非虚,那么如何为架构下一个定义-一定是一个由具体业务流量和模式支撑的架构软件(算法)的构造。一个是数据的复杂性(内在互相关系),一个是计算方法(步骤和缓冲)。从宏观角度,数据关系是更根本的东西。目前的高级语言,变量和流程(顺序、分支-步骤;循环-缓冲和迭代)研究的多,而数据复杂性构造不足。 同构现象。CPU指令集合可以说是硬件直接实现的软件软件帝国从这里提取软件精神,并升华它。从硬件的角度,从寄存器和指令执行流程,体现出的是变量和迭代(顺序更迭,循环往复)。(迭代流程)基于固定寻址的变量,经过寻址接口,可以处理任意数据,从而把迭代流程变成了一般流程。CPU的基本过程,产生了指令和数据,指令天生具有子程序的基因(一般流程),数据天生具有数据结构(寻址能力)的基因。高级的构造一般也是这种结构的类似:设计一套类似CPU的机制,支撑程序和数据;独特的“寻址机制”和“CPU处理能力”是实现构造的核心机制;迭代是所有这种机制的动力学和构造方式。而数据是“寻址机制”的基础。抽象是数据的工厂,也因此必须研究抽象技术。 抽象技术。所谓抽象,就是具体,是范围的界定和比对(两种具体对象之间的比对)。如果范围界定的完整,那么比对建立的联系就是普遍联系,普遍联系也就是所谓抽象原则。 评价标准。软件架构需要评测。这种评测是“在商言商”似的评测。评测的基础是软件架构的具体。当掌握了架构的构造方法,每种架构本身也就具体,是一种具体的架构。一种具体架构,就可以识别;可以识别则可以客观评测。可以按照立体架构的“压力”、“流量”等概念进行评测。 需求的把握-需求的变。我们希望永恒不变的需求,核心需求和需求方式(表现和满足步骤);而事实上需求总在演软件必须无条件、最大限度地方便需求的表达和需求的满足。软件可能永远只是皮肤,需求源于现实核心深处,软件是一件衣服。这种观点下,软件是没有中心的一种架构软件架构和需求之间联系的定量评测。 软件和算法的分开 软件的构造作为软件的通用属性 需求的独立 推论:算法是应用的算法。比如数学公式的计算、图形图象的处理、频谱分析、词法和语法分析。因此算法不是通用的软件算法。也因此软件构造是软件规范的一部分,因为它是通用的软件构造技术。 计算技术和应用之间有明显的区别,是两种不同的成分。软件规范是纯粹的,只关心计算技术。而不关心应用建模。计算方法本身早已经被发现了(也就是怎么自动计算,或者说什么是可计算的),剩下的问题只是应用问题。把应用问题的解决纳入软件计算模式。自动计算技术在汇编指令集合那里得到了说明。所谓软件设计是把这种计算方式发扬广大。 所谓算法,就是明确问题,然后发现用自动计算的方式解决问题。从这个意义上说,软件是应用问题导向的。那么,也就是要以问题为中心谈论软件。不同类型的问题需要的解决方式有独特的强调。这也就反映为所谓不同的软件技术。所以,区分软件计算技术和应用问题的成分,是软件规范需要首先识别的东西。 解决问题。本质上是把问题装到变量里面的过程,是放大CPU寄存器的过程。表示层:(把局面、环境;起点和终点需要定义在一个世界里)装进去,组织起来。计算层(展开层):基于表示,定义问题解决步骤(定义运动和过程)。 需求分析。问题描述采用的方法可能应该和软件算法完全分开。否则不能发现问题描述的创造性方法,不能表达问题本质。阐述问题,写文章我们有某篇布局之法;哲学研究我们有严谨的逻辑方法。需求分析,我们一定可以创造自己的方法。这是什么方法?满足使用要求,满足使用流程。离散/隔离各个需求。事实上,面向外部的分析理解和面向内部的分析理解之间有鸿沟。因为这是两个不同的世界。在两个相差悬殊的世界之间,搭建的构造也必然多种多样,以奇为平常。那么,建立联系的媒介少的可怜。可能问题本身也正在于这种联系的分析设计软件的量,是静态的。强调这部分就忽略了活跃的、奇异的、动态的部分。软件的出现不仅仅是被动地适应显示需求,同时也改变了现实需求本身。这种和现实需求融合在一起形成的状态,正是软件活跃的部分。在以前,仅仅以“应用软件”指称是不够的。(操作系统、编译软件、应用软件) 在范畴上,分为三个层次,或说3个范畴域: 1、 活跃的、黏性的动态层次。应用层。和现实之间的界面,是设备逻辑。需求简、解决方案的奇异性;应用算法的专业性。这是软件形象最活跃的部分。 这里用的是抽象(业务流程)和具体(设备能力)统一的思维方法,构造逻辑的软件过程同时又是可以用具体进行描述的;动态的、物理的分析手段(物理的量)。 业务流程的设计几乎就是艺术设计。 2、 中间层。程序构造层。语言、编译技术、数据结构设计方法(过程、数据、对象)等可以形式的计算机科学的任务。对程序能力进行抽象,设计程序自动生成的一套系统:语言、计算系统、编译系统。这是在静态和活跃部分之间的层次。这里的观念:设计方法、主程序、程序过程(和应用层的过程不是一一对应的)。 3、 静态层。软件的量,度量层。所有程序构造过程的差别消失了。这是软件的静态观点。 每层都有对软件的自己的理念,概念、过程和模型。两个层的对比,则凸显出不可调和的差别。也是所有关于软件的不成熟的印象、抽象产生的地方。 在应用层,抽象的、逻辑过程强一些。想象的部分占据主要的部分。需要对现实的业务,基于设备的具体能力,进行构造。 3个范畴定义了“软件”和“程序”的分别。第1层和第3层论述的是“软件”,而第2层论述的是“程序”。 软件和程序的研究方法不同。程序研究方法是完备的,而软件不完备。 程序开发应当体现软件特性。1)是逻辑的过程,总体的过程和子过程的观察和校验程序。2)软件的量层次上,软件的规模、运行强度和稳定性指标的自测试程序。 第二阶段 一定要有一个标准。软件如衣服,软件的交付文档应当显示出衣服是如何编织起来的。(相对于需求,软件是衣服,非核心;相对于硬件,软件是衣服,包裹) 要有一个理论说明。 架构也是衣服的一个部件,类似衣服的连接方式,模块集合的重心比对。 衣服是一个没有核心的结构软件也一样要显示出这个特性。 无论如何,我们需要有观察软件的眼光,无论一套软件依据什么样的理论产生。 什么是软件?描述是软件的存在形式(文本格式)。软件一定是可执行的(这是软件的严肃性,精确、定量)。软件是异的,一般异为具体、特例(对抽象力最好的归结方式)(没有完美满足需求的软件,相对于需求,软件只能满足固定的需求,而不能满足需求的变,即一款软件总是具体的;由一般产生出具体的思考方法,也就是构造的方法;或着是磁力打造,一个好的理论一定对现实素材有吸引力,向磁铁一般;这也是在矛盾中建造现实的方法,只要是具体的就肯定是可以分析出潜在矛盾、不完美的,问题不仅仅是分析、认识现实,还要能够构造现实;不存在完美的现实,只存在完美的理论 科学研究的方法是简工程方法是‘相似’,复制发现事物时的状态,那么事物的表现就会复现。 在具体这里,软件和硬件工作的方法在结果上实现了一致。只是方向不同,软件是从一般进行到具体;硬件一开始就是从具体出发,层层构造,搭建系统。硬件的设计明显具有以工艺、器件为核心的特征。配合器件的特新,进行外围设计。在硬件领域,是‘具体’为上;在软件领域,是‘具体’为下。) 对具体性的解释:组成所有物资的电子、质子、中子是圆的、相同的,但是这些相同的东西组成的原子则有几百种不同。每次量的规模的添加,都导致特殊性的添加。对于软件来说,也是如此。如下的概念是母庸质疑的,软件如同大山,沟壑鲜明。(这种巨大的特殊性,一定是和巨大的需求特殊性相应的)。 “软件以文本形式存在;软件在执行着;软件以个例的形式存在”,归结为在一起就是“软件是具体的”。 一级别的定义:软件与数据和逻辑相关(数据和逻辑是软件的基本语义)。软件与过程相关(积分(存储,数据的数据)和步骤(逻辑);过程是步骤的遍历,是数据的消长变)。 执行的异。区分独立执行和整体执行的概念。独立执行的代码称为模块,否则只是‘片段’。独立性和数据完整性相关,数据越庞大那么不独立的代码片段越多,模块就越大。模块独立性具有比和整体执行所要求的更大的自由度,也就是说整体只是使用了模块一部分的执行能力。模块独立执行获得的自由度是应该能够度量;模块的执行设计应该为了获取更大的自由度;自由度是模块可执行性质量的评定指标。对于整体执行的设计来说,自由度设计可能是设计过程的主导方法,它和全面、完整的需求理解相关,也和需求变相关;因此自由度设计也是需求定位的设计软件的量,也就是软件的能力。这是理解软件解决问题的方式的基础。比如逻辑能力、计算能力、存储能力、图象能力等。 软件是运行的,软件是自我构造的,软件的全体的各个环节都有自己的量。编译、操作系统、文件管理等各环节都是不同分工的软件实现的。 需要构造在功能层次上的互相配合,解释这种完整性。显然每个部分都具有独立的完整性;完整性和完整性的配合构成一个总体的系统。因此未必要求系统的完整性、长期性、稳定性。反过来,系统满足需求的快速性、快速变适应性、和现实一起变、消长的特性、瞬态响应特性可能更接近系统的本质。 这好比太极拳,要在一个完满的氛围里运动。 软件能力是比代码高一个级别的抽象。又是构成软件内涵的基础语义。 ‘设备能力’的概念更基础,可以统一所有其它能力;又可以作为以硬件为中心的观念的基础。 能力的获得在于‘二分’。在于互相支撑的界面,支撑在一起的双方互为能力。 1.所谓需求分析,我们总是在创造一套新的方法和语言。而最有效的需求分析是自然语言分析。借助人们心目中的全部理解所用到的描述形式。也就是进入到实际存在的需求中去理解需求,分析需求。 因为领域、术语、行业表述习惯的原因,这个阶段千差万别。 2.其次是电脑的使用方式-电脑技术(外设、通信和电脑本身的硬件形态),尝试去设计合适的使用方式和硬件解决方案。 这里有使用环境、专业技术、成本、时间,以及个人习惯等原因,同样是一个精彩的过程。对领域工作方式的熟悉、外设相关的专业技术背景、折中技术决定了这是一个经验至上的活动。这就是电脑使用方式的确定。 3.进一步,确定使用者角色。使用者和使用地点关联。使用地点也就是前面电脑使用方式的一部分。 这是一个沟通过程,也是对有了电脑辅助参与,相关领域习惯改革的问题。 4.然后,进入二元分析阶段:使用者管角度、客观功能角度,分析功能,并完成二者之间的映射。 这个阶段,功能被量。职能量。职能和功能之间会有模糊,有授权的转移。这个阶段就是充分考虑这些问题。 5.然后,进入传统的需求分析阶段。 计算架构和功能描述的规格分析。使用者界面规划(详细、规格级别)。 界面规划、功能、架构三者之间组成互动的具体过程。 最后会产生系统级别的文档。运行实体、接口;系统运行态、实体接口的输入输出规格。 6.然后,实体级别的程序构造阶段。 算法构造和程序构造。主要是从资源占用的角度确定宏观的算法。在这个阶段,是程序文档阶段。文档这个属于是这个阶段的工具。 最后会产生严格的程序模块的文档。所有这些文档组合起来,可以构成运行流程。这些文档的程序就是逻辑的程序本身。 7.最后,编码阶段 用一种具体的语言,按照模块文档的接口、资源、算法要求,编制代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值