软件设计与体系结构复习整理题目及答案

更新时间:2024-01-31 17:37:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1、各种性能指标的定义及如何到达各种性能指标的方法ppt1-8 119页-124页

①性能:吞吐量Throughput、响应时间Response Time、Deadlines

②实现吞吐量:Peak & Average Many system have low average but high peak throughput requirements

③实现响应时间: Guaranteed & Average E.g. 95% of responses in sub-4 seconds, and all within 10 seconds

④Dealines:Deadlines often associated with batch jobs in IT systems

2、常用的中间件有那几种类型(四种)

Business Process Orchestrators Message Brokers Application Servers Transport BizTalk, TIBCO StaffWare, ActiveBPEL

BizTalk, WebSphere Message Broker, SonicMQ J2EE, CCM, .NET

Message-Oriented Middleware, Distributed Objects Systems

分类:Business Process Orchestrators 业务流程协调器 Message Brokers 消息代理 Application Servers 应用服务器 Transport

面向消息的中间件,分布式对象系统

(1)CORBA---公用对象请求代理(调度)程序体系结构,它在对象间建立客户-服务器的关系,这样一个客户可以很简单地使用服务器对象的方法而不论服务器是在同一机器上还是

通过一个网络访问。 (常见的对象请求代理架构)

(2)Basic Message-oriented middleware---- MOM指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可在分布环境下扩展进程间的通信,并支持多通讯协议、语言、应用程序、硬件和软件平台。 (面向消息的中间件)

(3)J2EE---- J2EE核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共同的标准及规格,让各种依循J2EE架构的不同平台之间,存在良好的兼容性,解决过去企业后端使用的信息产品彼此之间无法兼容,企业内部或外部难以互通的问题。

(4)Message brokers----消息代理是一种在数据源与目的地之间移动数据使信息处理流畅的软件技术,数据源与目的地包括已有的应用、文件、数据库、对象、硬拷贝输出及Web客户端等。 (消息代理)

(5)Business process orchestrators----“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。(业务过程代理)

3、什么是软件架构(好几种定义,但是主要点是结构,元素,关系,接口)PPT第4页

架构是一个系统的基本组织,体现在它的组件,它们之间的相互关系和环境,其设计原则和进化论

程序或计算系统的软件架构是系统的结构或结构,由软件元素,这些元素的外部可见的属性,它们之间的关系

(软件架构)超过计算的算法和数据结构;设计和指定的总体系统结构作为一种新的问题出现。结构性问题包括组织和全球生产总值(gdp)控制结构;协议进行通信,同步和数据访问;

分配的功能设计元素;物流;设计元素构成;扩展和性能,设计方案中选择

它是关于软件设计:所有的架构是软件设计,但不是所有的设计都是软件架构。设计过程的一个部分;简单地说,架构关注“一旦系统建立后就很难或是不可能改变的问题”:质量属性,例如安全性,性能;非功能性需求,像开销,硬件配置。

【百度答案】 软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。 软件架构是一个系统的草图。软件架构描述的对象是直接构成系统的抽象组件。各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。在面向对象领域中,组件之间的连接通常用接口_(计算机科学)来实现

系统的软件体系结构是建立一个对系统来说所需要的结构,包括软件元素,它们之间的关系,以及两者的性质。

4、什么是架构风格 PPT1-8 36页

? An Architectural Style defines a family of systems in terms of a pattern of

structural organization. It determines:

? the vocabulary of components and connectors that can be used in

instances of that style,

? a set of constraints on how they can be combined. For example, one

might constrain:

? the topology of the descriptions (e.g., no cycles). ? execution semantics (e.g., processes execute in parallel).

描述软件的基本结构组织或纲要,提供事先定义好的子系统,制定好责任并将它们组织在一

起的法则和指南。| 答案2: 也叫架构模式,一个架构风格描述软件系统里的基本的结构组织或纲要。架构风格提供一些事先定义好的子系统,指定他们的责任并给出把他们组织在一起的法则和指南。一个架构模式常常可以分解成很多个设计模式的联合使用。MVC模式就属于架构模式。

软件系统有哪几类结构?

模块、组件和连接器、配置。 模块分配具体的职责,是工作的基础;

我们调用运行时结构组件和连接器结构,在我们的使用中,组件始终是运行时实体; 分配结构描述从软件结构映射到系统的环境,组织、发展、安装、执行;

元素是一类模块(类、层或功能的划分等),模块与其他模块相关联通过概括化或专业化的关系;

元素运行组件如服务、同行、客户、服务器、过滤器等,连接器是组件间的通信工具;

5、有那些常见架构风格

(1)管道和过滤器架构风格 PPT 40页

适用于需要定义一系列的执行规则数据的独立运算。 组件在输入时读数据流,在输出时产生数据流。

优点:易于理解、支持重用、容易保持或增强、允许某些专业分析、支持并发执行

缺点:转换特性导致其不擅长处理交互系统、书写自己的过滤器时,过度地解析或不解析导致性能损失和更加复杂

举例:unix的shell脚本、传统编译器

组件:称为过滤器,应用于对局部的输入流的转换,经常增长的计算,因此,在输入结束前输出就开始了。

. 连接器:称为管道,给流提供管道,把一个过滤器的输出传输到另一个输入。

(2)面向对象风格 PPT49页

适用于主要问题是识别和保护信息的相关主体。 数据代理和它们相关的操作封装在一个抽象数据类型里面。

优点:可以改变实施而不影响客户,可以设计作为独立的交互代理的集合的系统 缺点:一个对象与另一个对象进行交互时第一个对象必须知道第二个对象的身份。对象引起的副作用。

举例:java,c#开发的系统 组件:对象

连接器:功能和过程调用(方法) (3)隐式调用风格

应用于涉及到组件的松耦合集,其中的每一个都执行一些操作,还可能允许其他的操作。

尤其对必须很快重新配置的应用很有用

改变服务的供应商

可能的或是不可能的能力

不是直接的引用过程

一个组件能发表一个或多个事件

在系统中的其他组件能够在事件中注册一个兴趣通过与事件和过程结合 当一个事件被声明后,广播系统(连接器)自己引用已经注册的事件的所有过程 所有声明的事件“隐式”造成了过程在其他模块的调用

优点:为重用提供强大支持、简化系统演化

缺点:当一个系统广播一个事件时,不知道其他哪些组件会响应,不知道依赖于响应被调用的顺序,不知道响应什么时候结束

举例:数据库管理系统中执行完整性约束(触发器) (4)客户-服务器风格 PPT64页

适用于涉及到分布式的数据和跨越一系列的组件的处理

优点:数据分布简单明确、位置透明、混合和匹配异构平台、易于添加新服务器或升级现有

服务器。

缺点:没有名称和服务的中央寄存器—很难找到什么服务是没用的 举例:文件服务器、数据库服务器、对象服务器 组件:

服务器:标准独立的组件提供特别的服务,如打印,数据管理等。 客户端:组件调用服务器提供的服务。 连接器:网络,允许客户端访问远程服务器。

(5)分层风格 PPT72页

适用于涉及到分布式的能够分层的组织的类的服务,每层给它的上一层提供服务,同时作为下一层的客户端,只有仔细地从内层选择选择过程,才能用于他们临近的外层。 优点:设计(基于提高抽象层次)、改善(一个层的功能改变最多影响两个层)、重用(相同层的不同实现可以交替使用) 缺点:并不是所有的系统都可以很容易的实现分层,性能需求可能迫使底层实现高级功能的耦合。

举例:分层通信协议、操作系统 组件:典型的过程的集合。

连接器:典型的在有限的可见性下的过程调用 (6) 仓库风格 PPT80页

适用于主要问题是建立、增加和维护复杂信息的主体部分,信息一定要能够用很多种方式操作。经常需要长期的存在。

优点:有效存储大量数据、共享式模式模型、集中式管理

缺点:必须先达成一个数据模型、很难分配数据、数据升级很昂贵

举例:信息系统、编程环境、图形编辑器、人工智能知识基础、逆向工程系统

组件:

主要的数据结构能够表示出系统的正确状态 操作主要数据结构的独立组件的集合 连接器:典型地过程调用或是直接内存访问

(7)解释程序风格 PPT87页

适用于执行解决方案的最合适的语言或是机器不是直接可用的。 优点:模拟无实现的硬件、促进跨多种平台的应用程序或语言可移植性 缺点:

举例:编程语言编译器、基于规则的系统、脚本语言

组件:包括一个状态机,有一个执行引擎和三个记忆状态: 当前的执行引擎的状态 程序被翻译

当前的被翻译的程序的状态 连接器: 过程调用 直接内存访问

(8)过程控制风格 PPT94页

适用于目的是维护特殊过程的输出属性在给定参考值的情形下 优点: 缺点:

举例:实时系统软件用来控制(核电站、汽车巡航控制)

组件:

过程定义 包括操作一些过程变量的机制 控制算法 决定如何去操作过程变量 连接器: 数据流关系 过程变量:

被控制的变量的值是系统能控制的

输入变量能够检测过程的输入

操纵变量的值能够被控制器改变 设置断点 是一个控制变量所需要的值 传感器 获得过程变量与控制有关的值

6、架构师需要的核心技能是什么

(1) 涉众之间的交流 (2) 技术知识(3) 软件工程学 (4) 风险管理

7、什么是架构视图 PPT 15页

一个架构视图是对于从某一视角或某一点上看到的系统所做的简化描述,描述中涵盖了系统的某一特定方面,而省略了此方面无关的实体。

8、软件架构过程(三个迭代步骤)PPT1-8 202页

Determine Architectural Requirements ArchitectureDesignValidation 1、确定架构需求:架构上重要的需求(结构用例)---基本的质量和系统的非功能性需求 2、架构设计:迭代的设计步骤---风险识别是一个重要的输出设计

3、结构验证:验证阶段---验证阶段的目的是增加信心的设计团队的架构是适合的目的;验证必须实现在项目时间和预算的约束,关键是要尽可能严格的和有效的;验证一个架构设计提出了严峻的挑战,因为这是一个设计不能执行或测试,包括新和COTS组件集成;两种主要的方法:

手工测试使用的测试场景的体系结构,建设一个原型创建所需的应用程序的一个简单的原型;目的是识别潜在缺陷在设计实现生效前,这样他们就可以得到改善,在建造之前修复成本更便宜

9、软件质量属性主要包括哪些(五种)ppt1-8 116页

Reliability 可靠性、 Availability 可用性、 Portability 可移植性、 Scalability 可伸缩性、 Performance (!) 性能

10、软件可用性取决于(三种时间)PPT146页

? Time to detect failure 故障检测时间 ? Time to correct failure 纠正失败时间

? Time to restart application 重新启动应用程序时间

11、伸缩性涉及那些方面(四种)ppt1-8 116页

? Request load 请求负载 ? Connections 连接 ? Data size 数据大小 ? Deployments 部署

12、吞吐率指标 PPT120页

? Transactions per second 每秒事务数 ? Messages per minute 每分钟的消息 ? Messages per second (msp)

? Maximum sustainable throughput (MST) 最大可持续吞吐量

13、架构元素的通信包括哪些 PPT 10页

数据传递机制,例如:函数调用、远程方法调用、异步消息

控制流:组件之间的消息流来实现需要的功能、顺序、并发/并行、同步

14、各种架构风格的组件和连接器是什么

见5

15、软件性能指标主要有哪几种(三种)

吞吐量、响应时间、Deadlines生死线

16、响应时间的度量(两种) PPT 122页

? Usually measured in (milli)seconds Guaranteed可保证的、Average

17、安全性质量指标主要有哪几种(五种)PPT142页

? Authentication: Applications can verify the identity of their users and other

applications with which they communicate.

身份验证:应用程序可以验证他们的用户的身份和他们通信的其他应用程序。 ? Authorization: Authenticated users and applications have defined access rights to

the resources of the system.

授权:身份验证的用户和应用程序定义了系统资源的访问权限。 ? Encryption: The messages sent to/from the application are encrypted.

加密:从应用程序发送到/从应用程序的消息是加密的。

? Integrity: This ensures the contents of a message are not altered in transit.

完整性:确保在传输过程中不会改变消息的内容。

? Non-repudiation: The sender of a message has proof of delivery and the receiver

is assured of the sender’s identity. This means neither can subsequently refute

their participation in the message exchange.

不可否认性:一个消息的发送者有传递的证明,接收者保证了发送者的身份。这意味着既不能反驳他们的信息交换的参与。

18、实现高可用性的策略(三种)PPT146页

Strategies for high availability:

Eliminate single points of failure 消除单点故障 Replication and failover 复制和故障转移

Automatic detection and restart 自动检测和重新启动

19、信息隐藏原理

PPTlecture9 88页

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。

信息隐藏(封装)主要是为了提高软件的可重用性和可维护性。信息隐藏造成了系统各个部分耦合性低。系统是由各个部分构成的,如果这些部分耦合性低的话,那么这个系统开发、维护等就较容易

? Often one hides, e.g.

– Data representation. – Choice of algorithm.

– Interface details / access mechanism of external entity (e.g. database,

hardware) – …

? Goal: particular design choice “invisible” to clients. Why would we want to do this?

? Information Hiding may or may not be supported at the programming language

level.

20、GRASP模式的具体内容(9个),各种模式的定义,解决的什么问题

1创造者 Creator ○

分配给类B职责来创造类A的一个实例如果: (1) B聚合A的对象 (2) B包含A的对象

(3) B记录A的对象的实例 (4) B紧密地使用A的对象 (5) B被创建时有初始化的数据传递给

解决方案:将创建一个类A的实例的职责指派给类B的实例,如果下列条件满足的

话:

a) B聚合了A对象 b) B包含了A对象

c) B纪录了A对象的实例 d) B要经常使用A对象

e) 当A的实例被创建时,B具有要传递给A的初始化数据(也就是说B是创建A的实例这项任务的信息专家) f) B是A对象的创建者

如果以上条件中不止一条成立的话,那么最好让B聚集或包含A 通俗点就是:我要用你所以我来创建你,请不要让别人创建你 这个模式是支持低耦合度原则的一个体现

○2专家 Creator

在设计对象(类)时,如果某个类能够在某方面具有完整信息,足以实现某责任,就将这个责任分配给这个类,

解决方案:将职责分配给具有履行职责所需要的信息的类

通俗点就是:该干嘛干嘛去,别管别人的闲事或者我的职责就是搞这个,别的事不管。

举个简单的例子,如果有一个类是专门处理字符串相关的类,那么这个类只能有字符串处理相关的方法,而不要将日期处理的方法加进来。也就是提高软件高内聚一种原则。

3控制器 Controller ○

控制器是在用户接口层上的第一个对象,负责接收和处理系统的操作信息。

解决方案:将处理系统事件消息的职责分派给代表下列事物的类: a) 代表整个“系统”的类(虚包控制者) b) 代表整个企业或组织的类(虚包控制者)

c) 代表真实世界中参与职责(角色控制者)的主动对象类(例,一个人的角色) d) 代表一个用况中所有事件的人工处理者类,通常用“<用例名>处理者”的方式命名(用例控制者)

这是一个控制者角色职责分配的原则,就是哪些控制应该分派给哪个角色。

4低耦合 Low Coupling ○

测量存在于模块之间的依赖程度

解决方案:在分配一个职责时要使保持低耦合度。

耦合度(coupling)是一个类与其它类关联、知道其他类的信息或者依赖其他类的强弱程度的度量。一个具有低(弱)耦合度的类不依赖于太多的其他类。

5高内聚 High Cohesion ○

测量一个共享的模块内元素的相关性 ;一个单独模块执行任务的程度是功能相关的

解决方案:分配一个职责的时候要保持类的高聚合度

聚合度或内聚度(cohesion)是一个类中的各个职责之间相关程度和集中程度的度量。一个具有高度相关职责的类并且这个类所能完成的工作量不是特别巨大,那么他就是具有高聚合度。

6多态 Polymorphism ○

当相关的供选方案或行为随着类型的变化而变化时,给行为分配职责—使用多态操作—来适合行为变化的类型。

也就是说尽量对抽象层编程,用多态的方法来判断具体应该使用那个类,而不是用

if instanceof 来判断该类是什么接来执行什么。

7纯虚构 Pure Fabrication ○

分配一系列高度聚合的职责给虚假的类或是不表现某事完成的领域问题概念的有用的类,它支持高内聚、低耦合、可重用。

一个纯虚构意味着虚构某些事物,而不是到了迫不得已我们才这样做。

例,我们的Sale类的数据要存入数据库,但是他必须和数据库接口相连接,如果将接口连接放入Sale类中势必增加该类的耦合度,所以我们可以虚构一个类来处理与数据库接口连接的问题。这个类就是我们虚构出来的一个事物。

8间接 Indirection ○

问题:如何分配职责避免直接耦合?如何减弱对象的耦合?

解决方案:分配职责给中间的调解对象来调解两个组件之间的关系。

将职责分配给一个中间对象以便在其他构件或服务之间仲裁,这样这些构件或服务没有被直接耦合。这个中间对象(intermediary)在其他构件或服务间创建一个中介者(Indirection)。这个中间对象也就事7)中的纯虚构。

9防止编译Protected Variations ○

问题:如何设计对象,子系统和系统,使其内部的变化和不稳定不会对其他元素产生不良影响?

解决方案:识别设计变化或不稳定之处,分配职责用以在这些变化之外创建稳定接口

分配职责给一个客户端的直接对象以使它与一个间接对象进行协作,这样客户端无

需知道这个间接对象。

这个模式-也被叫做(Demeter)准则。 通俗点就是:只与你直接的朋友们通信 不要跟“陌生人”说话

每个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位

GRASP用职责设计对象:\它包含了9个基本模式: 1.信息专家(Information expert) 2.创建者(Creator) 3.高内聚(High Cohesion) 4.低耦合(Low Coupling) 5.控制器(Controller) 6.多态性(Polymorphism) 7.纯虚构(Pure Fabrication) 8.间接性(Indirection) 9.变化预防(Protected Variations)

GRASP的主要特征: - 对象职责分配的基本原则。 - 主要应用在分析和建模上。 GRASP的核心思想的理解: 自己干自己的事(职责的分配) 自己干自己的能干的事(职责的分配) 自己只干自己的事(职责的内聚)

21、OO设计的五个基本原则及课件中讲述的其它软件原理 r-32-71

1单一职责原则 ○

这个原则和关注点分离紧密联系。它陈述了每个对象应该只有一个理由去改变,单一聚焦在

职责上。通过依附这个原则,你避免了庞大的类的设计问题,那就像瑞士的军刀。有了精确的对象,你再次增加了系统的可读性和可维护性。 2开闭原则 ○

这个原则陈述了类应该对扩展开放,对修改关闭,那样你就能够添加新的特征,扩展一个类而不用改变它内部的行为。这个原则旨在避免破坏存在的类及依赖它的其他类,这使得你的整个应用程序中产生故障和错误的涟漪。 3 Liskov替换原则 ○

Liskov替换原则要求你应该能够使用任何衍生出的类代替父类,不用修改就有同样的行为。这个原则与开闭原则一致,它保证了一个衍生出的类不影响父类的行为,或者说,衍生出的类必须能够被它们的基类替代。 4接口分离原则 ○

这个原则是j将一个抽象方法分裂成几组职责,给这些组分配接口来防止客户端实现一个很大的接口,这个接口容纳了很多它们不使用的方法。目的是为了让类使用相同的接口只需要实现一些具体的方法,而不是有很多方法的庞大的接口。 5依赖反转原则 ○

把你的类从具体的实现中隔离开,使它们依赖于抽象类或接口。它促进了对接口而不是实现的译码,这通过保证对实现的低耦合来增加系统的灵活性。 PPT耿祥义-7: 1.面向抽象原则

设计一个类时,不让该类面向具体的类,而是面向抽象类或接口 2.开-闭原则

设计应当对扩展开放,对修改关闭。

如果您的设计遵守了“开-闭原则”,那么这个设计一定是易维护的,因为在设计中增加新的模块时,不必去修改设计中的核心模块。 3.高内聚-低耦合原则

如果类中的方法是一组相关的行为,则称该类是高内聚的,反之称为低内聚的。 所谓低耦合就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。

【其它基本原理】ppt review-32 Keep It Simple Stupid (KISS)

尽量保持代码简单而不要过分简单,这样可以避免不必要的复杂性 Don’t Repeat Yourself (DRY)

通过抽象使系统中不要出现重复的部分 Tell, Don’t ask

告诉你的对象要执行的操作,而不要询问(判断)它的状态,然后据此做决策 You ain’t Gonna need it (YAGNI)

偏好必要的功能需求,推迟可能需要的其它特色、 Separation of Concerns (SoC) 关注点分离

Minimize The Accessibility of Classes and Members 寻求类和其成员的访问性最小

Use Accessors and Mutators, Not Public Members 使用访问器和赋值函数,不要使用公共成员 Favor Composition Over Inheritance 偏好组合而不是继承

Coad's Rules(Use inheritance only when all of the following criteria are satisfied) Program To An Interface, Not An Implementation 面向接口而不是实现编程

22、组合,继承,针对接口编程,黑盒,白盒重用

继承:新功能的重用方法获得通过扩展现有对象的实现 泛化类(超类)明确了共同的属性和方法 专业类(子类)扩展了实现额外的属性和方法 针对接口编程又称为面向接口编程,针对接口编程就是要先设计以系列的借口,把设计和实现分开,使用时之需要引用接口即可,也由于系统各部分的解耦合。针对接口编程是为了提高程序的课维护性、可伸缩性和可复用性。如果你在一个类中直接使用另外的一个,这样就把两个类紧密联系在一起了,以后如果想做出改变就很难了。如果针对接口编程,当业务变

化时我们只需要用一个新的类实现接口即可

23、MVC模式 PPT9 16页

UInot the Java Swing libraries, but our GUI classes based on SwingSwingWebDomainSalesPaymentsTaxesTechnical ServicesPersistenceLoggingRulesEngine

UI layer has views,Domain layer has model

separating the visual, interaction and data components Model

maintains the state and data of the application - the XML document View

A rendering of the XML document Controller

The user interface presented to the user to manipulate the application Makes it very easy to have multiple different displays of the same information

? MVC是模型-视图-控制器的缩写

? 它代表了一种软件设计模式,1978年开发在施乐帕克研究中心(!) ? 它解释了一种分离视觉、交互和数据组件的方法。 ? 非常受欢迎,广泛用于Java和其他语言 模型 :维护应用程序的状态和数据的XML文档 视图 :XML文档的呈现

控制器 :用户界面呈现给用户操作的应用程序 为什么使用

Mvc模型

? “模型”包含的数据

? 有一些方法来访问并可能更新它的内容。 ? 通常,它实现了一个允许模型交互的接口。

? 实现了一个允许退出和取代的接口,并不伴随编程改变 Mvc控制器

? 用户与控制器进行交互。 ? 它解释鼠标移动,点击按键等

? 活动与模型沟通,如:删除行,插入行等 ? 它的模型的交互间接导致视图的更新 Mvc视图

? 视图提供模型的可视化表示。

? 在任何时候都可以有多个视图表示模型。

? 例如,一个公司财务状况随着时间的推移可以用一个表和图表示。 ? 只有两种不同的视图表示相同的数据。

? 当模型更新时,所有视图被通知然后有机会更新。 当模型更新时,所有视图被通知然后有机会更新

Model(模型)表示应用程序核心(比如数据库记录列表)。 View(视图)显示数据(数据库记录)。

Controller(控制器)处理输入(写入数据库记录)。 组成元素:模型、视图、控制器;

交互关系:用户通过视图发出一个请求,该请求被转发给控制器。控制器接收后决定使用什么模型,然后将请求转发给相应的模型。模型处理完后将相应的数据返回给控制器。控制器接收完数据后选择显示这些数据的相应的视图,并将视图返回给用户

24、企业应用架构在各层有那些主要的模式,各层,各层的各种模式的定义和结构内容(展现层,领域层,数据源层)

三层架构的系统:表现层实现用户界面,在领域层实现领域逻辑,在数据源层存取数据 1.表现层(Presentation):

提供服务、显示信息(如在WINDOWS或HTML页面中,处理用户请求,HTTP请求,命令行调用,批处理API) 表现逻辑处理用户与软件间的交互。主要职责是: 向用户显示信息

把从用户那里获得的信息解释成领域层或数据源层上的各种动作。 2.领域层(Domain):

领域逻辑,系统中真正的核心。也称为业务逻辑,它就是应用程序必须做的所有领域相关工作:包括根据输入数据或者已有数据进行计算,对从表现层输入的数据进行验证,以及根据从表现层接收的命令来确定应该调试哪些数据源逻辑。 领域逻辑(业务逻辑),它就是应用必须做的所有领域相关的工作:

根据输入数据或已有数据进行计算 对从表现层输入的数据进行验证

根据从表现层接收的命令来确定应该调度哪些数据源逻辑。 3.数据源层(Data Source):

与数据库、系统消息系统、事务管理器及其他软件包通信。最主要的数据源逻辑就是数据库,主要责任是存储持久数据。数据源逻辑主要关注与其他系统的交互,这些系统将代表应邀完成相关的任务。主要的数据源逻辑就是数据库,它的主要职责是存储持久数据。

三层的关系:领域层是核心!表现层是系统对外提供服务的外部接口;数据源层是系统使用外部服务的接口

25、Larman的敏捷UP设计方法的具体步骤

(1) 初始:大体上的构想、业务案例、范围和模糊评估。

(2) 细化:已精化的构想、核心架构的迭代实现、高风险的解决、确定大多数需求和范围以及进行更为实际的评估。

(3) 构造:对遗留下来的风险较低和比较简单地元素进行迭代实现,准备部署。 (4) 移交:进行beta测试和部署。

26、4+1视图 PPT 16页

“4+1”视图模型即从5个不同的视角(逻辑视图,进程视图,物理视图,开发视图

和场景视图)来描述软件体系结构。每个视图之关心系统的一个侧面,5个视图结合在一起 才能反映系统的软件体系结构的全部内容。

逻辑视图:描述架构的重要元素及它们之间的关系 过程视图:描述架构元素之间的并发和通信

物理视图:描绘主要的过程和组件是如何映像到硬件上的 开发视图:俘获软件组件内部的结构,如配置管理工具 架构用例:俘获架构的需求;和不止一种视图相关 (逻辑视图、流程视图、实现视图、部署视图、用例视图)

27、应用的集成策略

Data – expose application data for access by other components 公开应用程序数据供其他组件访问

API – offers services to read/write application data through an abstracted interface

即数据——公开应用程序数据访问的其他组件,提供服务来读/写应用程序数据通过一个抽象接口

28、上课讲的例子ICDE系统的四张架构图 PPT1-8 108

ICDE Performance Issues (1) Scalability 伸缩性 (2) Modifiability 可变性 (3) Security 安全性

(4) Availability 实用性(有效性、可用性) (5) Integration 集成性

Network Client Object Reference request Server Servant reply client ORB server ORB

反应—对正常和极端用法的脚本的反应是否足够快 可伸缩性—系统的能力克根据需要增加或减少 容量/产量—处理大负荷仍有反应 安全性—系统不会社会产生危害

29、非功能属性包括哪些(三种)PPT 12页

技术限制、业务约束、质量属性

30、掌握:命令模式,状态模式,装饰模式,观察者模式,策略模式,

单例模式,工厂方法模式,抽象工厂模式,组合模式 适配器模式,外观模式,责任链模式的UML图和java代码

①命令模式(别名:动作,事务) 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

②状态模式(别名:状态对象) 允许一个对象在其内部状态改变时改变它的行为。 ③观察者模式(别名:依赖,发布-订阅) 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。

④策略模式(别名:政策) 定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

⑤单件模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

⑥工厂方法模式(别名:虚拟构造) 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 ⑦抽象工厂模式(别名:配套)

提供一个创建一系列(相互依赖)对象的接口,而无需指定它们具体的类。 ⑧组合模式 将对象组合成数形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

⑨适配器模式(别名:包装器) 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

⑨外观模式 为系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

30、凡是课件里有关架构的具体例子(一般都有UML图或有代码)都需要仔细体会,

比如显示学生成绩和全名的程序的不同架构方法,Inheritance/Composition Example 1的例子(person,agent,passenger)的合理设计(在Review of Java and object-oriented programming PPT里55页), PPT9 276页

31、计算应收账款(Revenue Recognition)(lecture9PPT175页-42页)的不同设计

方法,农场计算动物脚数的设计方法(lecture9PPT35页-42页)等等(不一一列出了)。

单例模式:

单件模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单件模式是关于怎样设计一个类,并使得该类只有一个实例的成熟模式,该模式的关键是将类的构造方法设置为private权限,并提供一个返回它的唯一实例的类方法

1.单件类(Singleton): Moon.java public class Moon{

private static Moon uniqueMoon; double radius;

double distanceToEarth; private Moon(){

uniqueMoon=this; radius=1738;

distanceToEarth=363300; }

public static synchronized Moon getMoon(){ if(uniqueMoon==null){

uniqueMoon=new Moon(); }

return uniqueMoon; }

public String show(){

String s=\月亮的半径是\距地球是\ return s; } }

2.应用 Application.java import javax.swing.*; import java.awt.*;

public class Application{

public static void main(String args[]){

MyFrame f1=new MyFrame(\张三看月亮\ MyFrame f2=new MyFrame( \李四看月亮\ f1.setBounds(10,10,360,150); f2.setBounds(370,10,360,150); f1.validate();

f2.validate(); } }

class MyFrame extends JFrame{ String str;

MyFrame(String title){ setTitle(title);

Moon moon=Moon.getMoon(); str=moon.show();

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setVisible(true); repaint(); }

public void paint(Graphics g){ super.paint(g);

g.setFont(new Font(\宋体\ g.drawString(str,5,100); } }

———————————————————————————————————————

工厂方法模式(别名:虚拟构造)

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

模式的结构中包括四种角色: 抽象产品(Product)

具体产品(ConcreteProduct) 构造者(Creator)

具体构造者(ConcreteCreator)

1.抽象产品(Product) : PenCore.java public abstract class PenCore{ String color;

public abstract void writeWord(String s); }

2.具体产品(ConcreteProduct)_1 : RedPenCore.java public class RedPenCore extends PenCore{ RedPenCore(){ color=\红色\ }

public void writeWord(String s){

System.out.println(\写出\的字:\ } }

3.构造者(Creator):BallPen.java public abstract class BallPen{ BallPen(){

System.out.println(\生产了一只装有\笔芯的圆珠笔\ }

public abstract PenCore getPenCore(); //工厂方法 }

4.具体构造者(ConcreteCreator): RedBallPen.java

public class RedBallPen extends BallPen{

public PenCore getPenCore(){ return new RedPenCore(); } }

BlueBallPen.java

public class BlueBallPen extends BallPen{ public PenCore getPenCore(){ return new BluePenCore(); } }

BlackBallPen.java

public class BlackBallPen extends BallPen{ public PenCore getPenCore(){ return new BlackPenCore(); } }

5.应用 Application.java public class Application{

public static void main(String args[]){ PenCore penCore;

BallPen ballPen=new BlueBallPen(); penCore=ballPen.getPenCore();

penCore.writeWord(\你好,很高兴认识你\ ballPen=new RedBallPen(); penCore=ballPen.getPenCore();

penCore.writeWord(\ ballPen=new BlackBallPen(); penCore=ballPen.getPenCore();

penCore.writeWord(\ } }

———————————————————————————————————————

抽象工厂模式:

模式的结构中包括四种角色: 抽象产品(Prodcut)

具体产品(ConcreteProduct) 抽象工厂(AbstractFactory) 具体工厂(ConcreteFactory)

1.抽象产品(Product) : UpperClothes.java

public abstract class UpperClothes{

public abstract int getChestSize(); public abstract int getHeight(); public abstract String getName(); }

Trousers.java

public abstract class Trousers{

public abstract int getWaistSize(); public abstract int getHeight(); public abstract String getName(); }

2.具体产品(ConcreteProduct)_1: WesternUpperClothes.java public class WesternUpperClothes extends UpperClothes{ private int chestSize; private int height; private String name;

WesternUpperClothes(String name,int chestSize,int height){ this.name=name;

this.chestSize=chestSize; this.height=height; }

public int getChestSize(){ return chestSize; }

public int getHeight(){ return height; }

public String getName(){ return name; } }

2.具体产品(ConcreteProduct)_2: CowboyUpperClothes.java public class CowboyUpperClothes extends UpperClothes{ private int chestSize; private int height; private String name;

CowboyUpperClothes(String name,int chestSize,int height){ this.name=name;

this.chestSize=chestSize; this.height=height; }

public int getChestSize(){ return chestSize; }

public int getHeight(){

return height; }

public String getName(){ return name; } }

2.具体产品(ConcreteProduct)_3: WesternTrousers.java public class WesternTrousers extends Trousers{ private int waistSize; private int height; private String name;

WesternTrousers(String name,int waistSize,int height){ this.name=name;

this.waistSize=waistSize; this.height=height; }

public int getWaistSize(){ return waistSize; }

public int getHeight(){ return height; }

public String getName(){ return name; } }

2.具体产品(ConcreteProduct)_4: CowboyTrousers.java public class CowboyTrousers extends Trousers{ private int waistSize; private int height; private String name;

CowboyTrousers(String name,int waistSize,int height){ this.name=name;

this.waistSize=waistSize; this.height=height; }

public int getWaistSize(){ return waistSize; }

public int getHeight(){ return height; }

public String getName(){ return name;

} }

3.抽象工厂(AbstractFactory):ClothesFactory.java public abstract class ClothesFactory{

public abstract UpperClothes createUpperClothes(int chestSize,int height); public abstract Trousers createTrousers(int waistSize,int height); }

4.具体工厂(ConcreteFactory): BeijingClothesFactory.java

public class BeijingClothesFactory extends ClothesFactory {

public UpperClothes createUpperClothes(int chestSize,int height){

return new WesternUpperClothes(\北京牌西服上衣\ }

public Trousers createTrousers(int waistSize,int height){

return new WesternTrousers(\北京牌西服裤子\ } }

ShanghaiClothesFactory.java

public class ShanghaiClothesFactory extends ClothesFactory {

public UpperClothes createUpperClothes(int chestSize,int height){

return new WesternUpperClothes(\上海牌牛仔上衣\ }

public Trousers createTrousers(int waistSize,int height){

return new WesternTrousers(\上海牌牛仔裤\ } }

5.应用_1: Shop.java public class Shop{

UpperClothes cloth; Trousers trouser;

public void giveSuit(ClothesFactory factory,int chestSize,int waistSize,int height){ cloth=factory.createUpperClothes(chestSize,height); trouser=factory.createTrousers(waistSize,height); showMess(); }

private void showMess(){

System.out.println(\套装信息>\

System.out.println(cloth.getName()+\

System.out.print(\胸围:\ System.out.println(\身高:\ System.out.println(trouser.getName()+\

System.out.print(\腰围:\ System.out.println(\身高:\ }

}

5.应用_2: Application.java public class Application{

public static void main(String args[]){ Shop shop=new Shop();

ClothesFactory factory=new BeijingClothesFactory(); shop.giveSuit(factory,110,82,170);

factory=new ShanghaiClothesFactory(); shop.giveSuit(factory,120,88,180);}

}

抽象工厂模式的优点 :

抽象工厂模式可以为用户创建一系列相关的对象,使得用户和创建这些对象的类脱耦。 使用抽象工厂模式可以方便的为用户配置一系列对象。用户使用不同的具体工厂就能得到一组相关的对象,同时也能避免用户混用不同系列中的对象。

在抽象工厂模式中,可以随时增加“具体工厂”为用户提供一组相关的对象。

组合模式:

模式的结构中包括三种角色: 抽象组件(Component)

Composite节点(Composite Node) Leaf节点(Leaf Node)

组合模式是关于怎样将对象形成树形结构来表现整体和部分的层次结构的成熟模式。使用组合模式,可以让用户以一致的方式处理个体对象和组合对象,组合模式的关键在于无论是个体对象还是组合对象都实现了相同的接口或都是同一个抽象类的子类。

1.抽象组件(Component) : MilitaryPerson.java import java.util.*;

public interface MilitaryPerson{

public void add(MilitaryPerson person) ; public void remove(MilitaryPerson person) ; public MilitaryPerson getChild(int index);

public Iterator getAllChildren() ; public boolean isLeaf(); public double getSalary();

public void setSalary(double salary); }

2. Composite节点(Composite Node): MilitaryOfficer.java import java.util.*;

public class MilitaryOfficer implements MilitaryPerson{ LinkedList list; String name; double salary;

MilitaryOfficer(String name,double salary){ this.name=name; this.salary=salary;

list=new LinkedList(); }

public void add(MilitaryPerson person) { list.add(person); }

public void remove(MilitaryPerson person){ list.remove(person); }

public MilitaryPerson getChild(int index) { return list.get(index); }

public Iterator getAllChildren() { return list.iterator(); }

public boolean isLeaf(){ return false; }

public double getSalary(){ return salary; }

public void setSalary(double salary){ this.salary=salary; }

}

3.Leaf节点(Leaf Node):MilitarySoldier.java import java.util.*;

public class MilitarySoldier implements MilitaryPerson{ double salary; String name;

MilitarySoldier(String name,double salary){ this.name=name; this.salary=salary; }

public void add(MilitaryPerson person) {} public void remove (MilitaryPerson person){} public MilitaryPerson getChild(int index) { return null; }

public Iterator getAllChildren() { return null; }

public boolean isLeaf(){ return true; }

public double getSalary(){ return salary; }

public void setSalary(double salary){ this.salary=salary; } }

4.应用_1:ComputerSalary.java import java.util.*;

public class ComputerSalary{

public static double computerSalary(MilitaryPerson person){ double sum=0;

if(person.isLeaf()==true){

sum=sum+person.getSalary(); }

if(person.isLeaf()==false){

sum=sum+person.getSalary();

Iterator iterator=person.getAllChildren(); while(iterator.hasNext()){

MilitaryPerson p= iterator.next(); sum=sum+computerSalary(p);; } }

return sum; } }

4.应用_2: Application.java public class Application{

public static void main(String args[]) {

MilitaryPerson 连长=new MilitaryOfficer(\连长\

MilitaryPerson 排长1=new MilitaryOfficer(\一排长\ MilitaryPerson 排长2=new MilitaryOfficer(\二排长\ MilitaryPerson 班长11=new MilitaryOfficer(\一班长\ MilitaryPerson 班长12=new MilitaryOfficer(\二班长\ MilitaryPerson 班长13=new MilitaryOfficer(\三班长\ MilitaryPerson 班长21=new MilitaryOfficer(\一班长\ MilitaryPerson 班长22=new MilitaryOfficer(\二班长\ MilitaryPerson 班长23=new MilitaryOfficer(\三班长\ MilitaryPerson 班长31=new MilitaryOfficer(\一班长\ MilitaryPerson 班长32=new MilitaryOfficer(\二班长\ MilitaryPerson 班长33=new MilitaryOfficer(\三班长\ MilitaryPerson []士兵=new MilitarySoldier[60]; for(int i=0;i<士兵.length;i++){

士兵[i]=new MilitarySoldier(\小兵\ }

连长.add(排长1); 连长.add(排长2); 排长1.add(班长11); 排长1.add(班长12); 排长1.add(班长13); 排长2.add(班长21); 排长2.add(班长22); 排长2.add(班长23); for(int i=0;i<=9;i++){

班长11.add(士兵[i]); 班长12.add(士兵[i+10]); 班长13.add(士兵[i+20]); 班长21.add(士兵[i+30]); 班长22.add(士兵[i+40]); 班长23.add(士兵[i+50]); 班长31.add(士兵[i+60]); 班长32.add(士兵[i+70]); 班长33.add(士兵[i+80]); }

System.out.println(\一排的军饷:\排长1)); System.out.println(\一班的军饷:\班长11)); System.out.println(\全连的军饷:\连长)); } }

———————————————————————————————————————

适配器模式

1.目标(Target) : ThreeElectricOutlet.java public interface ThreeElectricOutlet{

public abstract void connectElectricCurrent(); }

2.被适配者(Adaptee): TwoElectricOutlet.java

public interface TwoElectricOutlet{

public abstract void connectElectricCurrent(); }

3.适配器(Adapter) TreeElectricAdapter.java

public class TreeElectricAdapter implements ThreeElectricOutlet{ TwoElectricOutlet outlet;

TreeElectricAdapter(TwoElectricOutlet outlet){ this.outlet=outlet; }

public void connectElectricCurrent(){ outlet.connectElectricCurrent(); } }

4.应用 Application.java_1 public class Application{

public static void main(String args[]){ ThreeElectricOutlet outlet;

Wash wash=new Wash(); outlet=wash;

System.out.println(\使用三相插座接通电流:\ outlet.connectElectricCurrent();

TV tv=new TV();

TreeElectricAdapter adapter=new TreeElectricAdapter(tv); outlet=adapter;

System.out.println(\使用三相插座接通电流:\ outlet.connectElectricCurrent(); } }

4.应用 Application.java_2

class Wash implements ThreeElectricOutlet{ String name; Wash(){

name=\黄河洗衣机\ }

Wash(String s){ name=s;

}

public void connectElectricCurrent(){ turnOn(); }

public void turnOn(){

System.out.println(name+\开始洗衣物。\ } }

4.应用 Application.java_3

class TV implements TwoElectricOutlet{ String name; TV(){

name=\长江电视机\ }

TV(String s){ name=s; }

public void connectElectricCurrent(){ turnOn(); }

public void turnOn(){

System.out.println(name+\开始播放节目。\ } }

———————————————————————————————————————

外观模式

模式的结构中包括两种角色: 子系统(Subsystem) 外观(Facade)

1.子系统(Subsystem)_1 : CheckWord.java public class CheckWord{

public final int basicAmount=85; String advertisement; int amount;

public CheckWord(String advertisement){ this.advertisement=advertisement; }

public void setChargeAmount(){

amount=advertisement.length()+basicAmount; //计算出计费字符数目 }

public int getAmount(){ return amount; } }

1.子系统(Subsystem)_2 : Charge.java public class Charge{

public final int basicCharge=12; CheckWord checkWord;

Charge(CheckWord checkWord){ this.checkWord=checkWord; }

public void giveCharge(){

int charge=checkWord.getAmount()*basicCharge; System.out.println(\广告费用:\元\ } }

1.子系统(Subsystem)_3 :TypeSeting.java public class TypeSeting{ String advertisement;

public TypeSeting(String advertisement){ this.advertisement=advertisement; }

public void typeSeting(){

System.out.println(\广告排版格式:\ System.out.println(\ System.out.println(advertisement); System.out.println(\ } }

2.外观(Facade): ClientServerFacade.java public class ClientServerFacade{ private CheckWord checkWord; private Charge charge;

private TypeSeting typeSeting;

String advertisement;

public ClientServerFacade(String advertisement){ this.advertisement=advertisement;

checkWord=new CheckWord(advertisement); charge=new Charge(checkWord);

typeSeting=new TypeSeting(advertisement); }

public void doAdvertisement(){ checkWord.setChargeAmount(); charge.giveCharge(); typeSeting.typeSeting(); }

}3.应用 Application.java public class Application{

public static void main(String args[]){ ClientServerFacade clientFacade;

String clientAdvertisement=\鹿花牌洗衣机,价格2356元,联系电话:1234567\ clientFacade=new ClientServerFacade(clientAdvertisement); clientFacade.doAdvertisement(); } }

课件里有关架构的几个具体例子,比如do it all程序的重构方法,计算应收账款(Revenue Recognition)的不同设计方法

Do it all:

public class DoItAll extends javax.servlet.http.HttpServlet { protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ... // { String lastName = request.getParameter(“…\

Connection dbc = DbRegistry.getDbConnection();

String findSql = \ PreparedStatement dbQuery = dbc.prepareStatement(findSql); dbQuery.setString(1, lastName);

ResultSet rs = dbQuery.executeQuery(); rs.next();

String firstName = rs.getString(\lastName = lastName.toUpperCase();

PrintWriter out = response.getWriter(); response.setContentType(\

out.println(\

}

}

计算应收账款(Revenue Recognition)PPT9 175页

概念模型:

本文来源:https://www.bwwdw.com/article/18iw.html

Top