软件设计与体系结构练习题 - 图文 下载本文

软件设计与体系结构复习

一、 填空题

(一) Chapter 1

1.软件设计模式通常包含4个基本要素:模式名称、问题、解决方案以及效果。 2.软件设计模式可以分为三个层次:架构模式、设计模式、习惯用法。 3.软件设计模式是对软件设计经验的总结,是对软件设计中特定环境下反复出现的设计问题的、经过验证的、成功解决方案的描述。

(二) chapter 5

1.早在1968年,计算机领域的大师Dijstra指出:项目规模越大,其整体架构就越重要。 2. 软件体系结构的三个基本要素是:构件、连接件、约束 3. 对软件质量的关注正是软件架构师与一般的软件设计师的不同之处,一般的软件设计师主要关注软件功能的设计,并要遵循架构师给出的设计准则。

4. IEEE 1471-2000标准定义软件体系结构是“系统的基本组织结构,包括系统构成要素、这些构成要素相互之间以及运行环境之间的关系,还包括系统设计及演化时应遵循的原则”。

(三) chapter 2

1.创建型软件设计模式是解决_对象创建机制_的设计模式。 2.创建型软件设计模式的两个主导思想:封装了系统使用的具体类的知识,隐藏这些具体类的实例被创建与结合的细节。

3.简单工厂方法模式的特点是仅仅有一个具体的创建者类,并且在此类中包含一个__静态工厂_____方法。

4.生成器模式是一步一步创建一个复杂的对象,允许用户通过制定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节

5. 单例模式是指确保一个仅有一个唯一的实例,并提供一个全局的访问点。

6. 在单例模式中,为了防止客户程序利用构造方法创建多个对象,要将构造方法声明为private(或私有)类型。

(四) chapter 3

1. 结构型软件设计模式的主要目的是将不同的类和对象组合在一起,形成更大或者更复杂的结构体。

2. 组合模式指将对象组合成树形结构,以表示“部分-整体”的层次结构。该模式使得对单个对象和组合对象的使用具有一致性。

3.适配器模式可以分为两种:类适配器和对象适配器 4. 类适配器模式通过继承的方式改变已经存在的接口而形成新的接口,使之适合客户类调用的需要;对象适配器模式使用调用或者聚合的方式选择调用多个类中的方法,形成新的接口。 5. 适配器模式与外观模式都是为了设计新的接口而存在。它们的区别在于:适配器模式是转换接口,外观模式是简化接口。

(五) chapter 4

1. 行为型软件设计模式解释对象之间是怎样进行交互的。

2. 迭代器模式能够提供一种方法按照顺序访问一个聚合对象中的所有元素,而又不需要暴露该对象的内部表示。

3. 中介者模式的要点是将所有对象之间的交互细节抽象到一个独立的类中,这个类叫做中介者类。

4. 访问者模式封装了分布于多个类之间的行为。

(六) Chapter 6

1. 利用调用-返回风格软件体系结构设计的软件系统使用的是_分而治之_策略,其主要思想是将一个复杂的大系统分解为一些子系统,以便降低复杂度,并且增加可修改性。

2. 在管道-过滤器软件体系结构中,每个组件都有一组输入和输出,组件读入数据流,经过数据处理,然后产生输出数据流。

3. 顺序批处理软件体系结构是数据流风格体系结构的一个子类型。在该系统种,组件为独立的程序,并且这些组件按照先后顺序处理,即只有当一个组件运行彻底结束以后,下一个组件才能开始执行。

4. 主程序-子程序软件体系结构特别关注功能的实现。面向对象软件体系结构特别关注数据与功能的封装。

二、 简答题

(一) Chapter1

1. 软件体系结构为什么重要?

答:软件体系结构: ①是软件相关人员进行交流的手段;(2分) ②是一种高层次的设计复用手段;(2分) ③是早期关键设计决策的体现。(1分) 2. 软件体系结构与软件框架的区别? 答:

①呈现形式不同:体系结构的呈现形式是一个设计规约,而框架则是程序代码 。(2分) ②目的不同:体系结构的首要目的大多是指导一个软件系统的实施与开发;而框架的首要目的是为复用.因此,一个框架可有其体系结构,用于指导该框架的开发,反之不然.(3分) 3. 解释开闭原则、Liskov替换原则、依赖倒置原则

答:①开闭原则:构件应该对扩展具有开放性,对修改具有封闭性。(2分) ②Liskov替换原则:子类可以替换它们的父类。(2分)

③依赖倒置原则:依赖于抽象,而非具体实现。(1分)

(二) chapter2

4. 说明工厂方法、简单工厂模式、抽象工厂模式三个模式的主要区别。

答:①简单工厂模式只有一个工厂类,该工厂类的静态工厂方法负责所有产品的创建。(1分)②工厂方法模式中,一个产品类层次对应一个工厂类层次,每个具体工厂负责创建一个具体的产

品。(2分)③抽象工厂模式中,一个工厂类层次对应多个产品类层次,每个具体工厂负责一个产品簇中产品的创建。(2分)

5. 实现单例模式的三个关键要点是什么?

答:①将构造方法私有化;(1分)②定义一个静态实例;(2分)③提供一个可以返回静态实例的静态方法。(2分)

6. 简述生成器模式与抽象工厂模式的区别。

答:①前者按照步骤创建一个复杂的对象,而后者强调一类产品对象,创建一个产品族中的某个产品对象(简单或复杂)。(3分)

②前者将所建造的产品(通常建造一个复合体)最后一次性返回,而不是一点一点返回,而抽象工厂所创建的产品对象立即被返回。(2分)

(三) Chapter3

7. 简述外观模式与适配器模式的区别?

答:①外观模式简化接口是为了更好地使用某个类库

②适配器模式转换接口的目的是将一个不适合使用的接口转换为可以被使用的接口,或者将一些接口不同但功能相同或相近的接口加以转换,以便统一使用。 8. 简述结构型模式的分类。

答:分为两类:

①结构型类模式:关心类的组合,使用继承来组合接口或类,提供了类之间的关联方式。(2分)

②结构型对象模式:关心类和对象的组合,描述了如何对一些对象进行组合,从而实现新功能的一些方法。具体来说,通过关联关系,可以在一个类中定义另一个类的对象,然后通过该对象调用其方法。(3分)

(四) Chapter 4

9. 简述迭代器模式的主要功能? 答:提供对聚合对象的迭代访问:

①以不同的方式遍历聚合对象,如向前、向后 ②对同一聚合同时进行多个遍历 ③以不同的遍历策略遍历聚合

④多态迭代:为不同的聚合结构提供统一的迭代接口,即,通过一个迭代接口访问不同的聚合结构。

10. 简述访问者模式中形成的回调访问通路?

答:visit()与accept()方法构成一个调用通路。(1分)

①visit(X):访问者类告知具体元素X类,我要访问你,即调用它的方法。(2分)

②accept(Visitor):具体元素X类告知Visitor,我接受你的访问。Visitor访问具体元素X类的目的是什么,具体元素X类不管。(2分) 11. 策略模式和状态模式的区别。

答:①策略模式用来处理一组具有相同目的但是实现方法不同的算法,这些算法方案之间一般来说没有状态变迁。(2分)

②状态模式则有所不同,它实现的一个概念可以叫做动态继承,也就是继承的子类都可以发生变化。状态的变化可以由一个状态迁移图表示。(2分)

③一般来说,实现状态模式更复杂一点,用户需要仔细考虑由谁来负责状态转换问题,是由Context类负责还是由状态类的超类负责,还是由状态类的子类负责。(2分)

(五) Chapter 6

12. 简述面向对象体系结构,并画出面向对象体系结构图?

答:面向对象体系结构中,把系统看作是由一些对象的集合组成(而不是由函数或方法组成),消息从一个对象发送到另外一个对象。每个对象都有其相关功能。一个对象是数据以对数据操作的封装体,外界通过接口与其进行交互。(3分)面向对象体系结构图如下:(2分,下面这幅图不需要一模一样,表达清楚意思即可)

13. 简述主程序-子程序软件体系结构与面向对象体系结构的不同之处。

答:①在设计思想上的区别:主程序-子程序关注功能的实现,即系统是由一个个过程构成。面向对象体系结构关注数据与功能的封装(对象)。系统是由一系列对象构成,这些对象按一定规则通信,完成具体功能。(3分)

②在系统分析设计方面的区别。前者采用结构化分析设计方法(如数据流图、面向数据流的设计),后者采用面向对象分析设计,使用用例图、类图、时序图等模型。(2分)

14. 画出MVC体系结构的一般形式的结构类图。

15. 画出应用了观察者机制的MVC体系结构设计类图。

三、 设计题

(一) chapter 2创建型设计模式

1. 一个房屋销售查询系统,以便查询不同类型的房屋的介绍、价格和地址等。为简单起见,只

考虑两种类型的房屋:别墅(House)和公寓(Condo),并假设每种房屋类型都包含:豪华(Super)、中等(Medium)两个等级。要求能够查看房屋信息和房屋价格,请使用创建型设计模式解决该问题,画出设计类图。 答:参考图 1

图 1 抽象工厂模式参考图

2. 假设有一个web托管公司,该公司在Windows和UNIX平台上托管服务。该Web托管公司

在这两种平台上提供三种不同类型的托管包:基本(Basic)、高级(Senior)和更高级(Super)。使用“抽象工厂”模式设计一个应用,查询该托管公司提供的不同类型的托管包功能,画出设计类图。

答:参考错误!未找到引用源。

<>UnixService<>AbstractFactory+provideService() : void+createWin() : WinService+createUnix() : UnixServicebasicUnix+provideService() : voidSeniorUnix+provideService() : voidSuperUnix+provideService() : voidBasicFactory+createWin() : WinService+createUnix() : UnixServiceSeniorFactory+createWin() : WinService+createUnix() : UnixServiceSuperFactory+createWin() : WinService+createUnix() : UnixService<>WinService+provideService() : voidBasicWin+provideService() : voidSeniorWin+provideService() : voidSuperWin+provideService() : void错误!未找到引用源。

图 2 抽象工厂模式解决win、Unix服务创建问题

3. 生成器模式可以用于描述肯德基KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食

(如汉堡、牛肉饭等)、配餐(如新奥尔良烤翅、香辣鸡翅、吮指原味鸡等)和饮料(如果汁、可乐等)等三个组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。套餐假设目前有如下几个套餐:午餐套餐(Lunch Suit)、晚餐套餐(Supper Suit)、豪华套餐(Luxury Suit)。请用生成器模式设计该应用,画出其设计类图。 答:参见图 3

Client+main()<>KFCBuilderKFCDirector-kfcBuilder : KFCBuilder+setKFCBuilder()+constructSuit()11+createMainFood()+createMatchFood()+createDrinker()+getSuit()LunchSuitBuilder+createMainFood()+createMatchFood()+createDrinker()+getSuit()SupperSuitBuilder+createMainFood()+createMatchFood()+createDrinker()+getSuit()LuxurySuitBuilder+createMainFood()+createMatchFood()+createDrinker()+getSuit()KFCSuit-MainFood : string-MatchFood : string-Drinker : string+setMainFood(in main : string)+setMatchFood(in match : string)+setDrinker(in drinker : string)图 3 生成器模式——KFC套餐构造

4. 下图所示设计类图是关于游戏软件的设计。在该设计中,SlowGameFactory类负责创建

SlowFighter对象与SlowMonster对象,并且将创建完的对象以其超类类型返回给ClientGUI对象。然后,ClientGUI对象将操纵SlowFighter对象与SlowMonster对象,使得它们互相打斗。

(1) 上述设计使用了什么设计模式?

抽象工厂

(2) 请在以上设计中添加SuperFighter和SuperMonster,SuperFighter与SuperMonster是对应的,请绘制新的设计类图。

修正一下该答案 5. 某公司要设计一个房屋选购系统,系统内的房屋分为三种类型:经济型(Economic

House)、普通型(Normal House)与豪华型(Luxury House)。不同房型的区别体现在面积大小(Area)以及卧室(Bedroom)、卫生间(Bathroom)、车库(Garage)、花园(Garden)、游泳池(Swimming Pool)的数量上。请用生成器模式设计该选购系统,画出设计类图。

(二) chapter 3 结构型设计模式

6. 使用组合模式设计一款使用不同国家的语言做为问候语的软件,需要一个用于用户输入的用

户图形界面。在该用户图形界面上,有各个主要国家的列表。用户可以选择一个国家,然后,单击产生问候语的按钮,程序将显示该国家见面时所使用的问候语。①使用安全形式设计,画出设计类图。②使用透明形式设计,画出设计类图。 答:①参见图 4 ②参见图 5

图 4 组合模式设计-安全形式

图 5 组合模式设计-透明模式

7. 下图所示为一个整数排序的Java程序设计类图。该设计使用类适配器模式。

问题:

(1) 请说明使用该设计有什么问题?

Java是单继承语言,不支持多继承

(2) 画出新的设计类图。

答:参见图 6

<>SortingAlgorithmsBubbleSort+bubbleSort() : int[]1..1BinarySort+binarySort() : int[]+bubbleSort() : int[]+binarySort() : int[]+superQuickSort() : int[]1..1Adapter-bubbleSorter : BubbleSort-binarySorter : BinarySort+bubbleSort() : int[]+binarySort() : int[]+superQuickSort() : int[]11

图 6 对象适配器解决多继承问题

8.

考察一个电源总开关的例子。为了使用方便,一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。通过该电源总开关可以同时控制上述所有电器设备。请使用外观模式设计该系统,画出设计类图。

答:参见图 7

SwitchFacadeClient+main()-lights[] : Light-fan : Fan-airCondition : AirConditioner-tv : Television+turnOnAll()+turnOffAll()Light-position : string+Light(in pos : string)+turnOn()+tunOff()Fan+turnOn()+turnOff()AirConditioner+turnOn()+turnOff()Television+turnOn()+turnOff()

图 7 电源开关的例子

9. 美国和加拿大的邮政编码有不同的格式,美国的邮政编码由5位阿拉伯数字组成加破折号,

再加4位阿拉伯数字组成,即美国的邮政编码形状为ddddd-dddd,其中d是介于0与9之间的整数。加拿大的邮政编码是由6位字母与数字混合组成,格式为:cdc dcd,其中第1,3,5位是英语字母,第2,4,6位是阿拉伯数字,如:M4B 1G5。假设有一个网上贸易软件,原来的客户是美国公民,但是,随着业务的扩展,将要允许加拿大公民使用该系统。假如已经有两个经过充分测试的类,一个是USZipCode,另外一个是CAPostalCode。这两个类中分别有一个方法,isValidZipCode(zip:String), 和isValidCaPostalCode(pcode: String),用于确认用户输入的邮政编码是否正确。虽然这两个接口(方法)的参数都是String类型的,但是方法名字是不同的,而且,它们的具体的确认算法是不同的。现在要写一个网上邮政编码确认程序,该程序使用一个统一的接口,允许客户程序使用该接口的时候,既可以使用美国的邮政编码又可以使用加拿大的邮政编码。请使用适配器模式进行设计,画出设计类图。

<>ZipCodeUSZipCode+isValidZipCode(in zip : String) : booleanCAPostalCode+isValidCaPostalCode(in pCode : String) : boolean+isValidZipCode(in zip : String) : boolean+isValidCaPostalCode(in pCode : String) : booleanZipCodeAdapter-usZip : USZipCode-caPostal : CAPostalCode+isValidZipCode(in zip : String) : boolean+isValidCaPostalCode(in pCode : String) : boolean

10. 假如公司需要设计一个特工信息系统。特工的信息被加密并且被存入文本文档或者数据库。

有三种方法加密特工的名字和代码,该加密名字和代码的任务由三个类完成,这三个类是EncryptedInfo1,EncryptedInfo2,EncryptedInfo3。请使用桥接模式设计该特工信息保密系统,画出设计类图。

11. 现需要设计一个可以模拟各种动物行为的机器人。目前,在机器人中已定义了一系列方法:

叫喊方法cry()、移动方法move()。如果希望在不修改已有代码的基础上使得机器人能够像狗一样叫wang(),像狗一样跑run(),使用适配器模式进行设计,绘制设计类图。

<>RobotDog+wang() : void+run() : void11+cry() : void+move() : voidDogAdapter-dog : Dog+cry() : void+move() : void

12.

设计一个飞行员信息管理系统。假设飞行员分为战斗机飞行员和轰炸机飞行员;在性别上又分为男飞行员和女飞行员。请使用桥接模式进行设计,画出设计类图。

Client<>PilotGender-pilotKind : PilotKind+getInfo() : String11<>PilotKind+info() : StringManPilot+getInfo() : StringWomanPilot+getInfo() : StringFightPilot+info() : StringBomberPilot+info() : String

13. 假设有一个设计类图如下所示。

此类图中包含了几个动物类,Tiger、Dog和Cat,它们都包含各自的功能,三个类相互协作并紧密耦合,以便完成类似于动物世界的游戏功能。请用中介者模式重新设计,保持功能不变,画出设计类图。

可将updateAll()方法修改为doGame(),在doGame()定义游戏规则。

14.

针对如下已经存在的某程序设计图,使用桥接模式重新设计该程序,并画出设计类图

client+main() : void<>MilkSize<>MilkType1..1+getOrder()+order()MedSizeMilk+getOrder()SuperSizeMilk+getOrder()CoffeeMilk+order()FragMilk+order() 15.

文件系统中的文件有不同类型,不同类型的文件其浏览方式有所区别,如文本文件和图片文件、视频文件的浏览方式就不相同。对文件夹的浏览实际上就是对其中所包含文件的浏览,而客户端可以一致地对文件和文件夹进行操作,无须关心它们的区别。请使用组合模式来模拟文件的浏览操作(display),画出设计类图。

<>*File+display() : void+add()+getChild(in index : int)+remove()TextFileImagFileVideoFile+display()+display()+display()

三) chapter 4 行为型设计模式

一个计算手机缴费的软件设计如下图所示:

1Directory+display()+add()+getChild(in index : int)+remove()

(16.

类中的type变量代表不同的客户群体,因此有不同的缴费率。因为对应于不同的客户群体,有不同的优惠收费包,例如FamilyPackage、FriendPackage和FamerPackage。方法computeFare(String num, String type)需要经常改变,原因是每个包都有不同的打折率,并且对于每个包计算费用的算法是不同的。这说明在方法computeFare(String num, String type)中,存在许多条件语句。很明显,本设计不符合开闭原则,请利用策略模式对以上的类进行重新设计,画出设计类图。 答:

client+main() : voidContext-ref : FarePackage+ComputeFare(in num : String, in type : string) : float11<>FarePackage+getFare(in num : String) : floatFamilyPackage-rate : float+getFare(in num : String) : floatFriendPackage-rate : float+getFare(in num : String) : floatFamerPackage-rate : float+getFare(in num : String) : float 17.

使用状态模式设计软件。在一个面向儿童的人/机对抗游戏中有两个角色,mood_guy代表计算机游戏软件,玩家为儿童。玩家可以容易地影响mood_guy。mood_guy有三个状态:愉快、恼怒和疯狂。当它在愉快的状态时,它将唱歌;当它在恼怒的状态时,它将告诉它的朋友,抱怨某事;当它在疯狂的状态时,它将故意损坏一些东西。mood_guy可以自动改变心情状态:如果玩家忽略它超过20秒,无论处于何种状态,mood_guy将自动进入愉快状态。mood_guy的状态也可以由玩家的行为而改变:如果它处于愉快状态,玩家给它一个酸梨,则它进入恼怒状态;如果它处于恼怒状态,玩家给它一个辣椒,它将进入疯狂状态;如果它处于疯狂状态,玩家给它一个香蕉,它将进入愉快状态。要求使用状态模式设计该问题,并且:(1)画出状态图;(2)画出设计类图,该类图中应该包含两个方法:act( )和changeMood( )。

18. 设计一个使用几种排序算法对整数进行排序的程序。该程序可以计算出每种排序算法的执行

时间,以便比较各种排序算法的速度。该程序可以支持插入排序(InsertionSort)、快速排序(QuickSort)、冒泡排序(BubbleSort)、堆排序(HeapSort)。请使用策略模式进行设计,画出设计类图。

19. 利用状态模式设计的Weather State的实例。在本例中,考虑天气状态。天气状态可以分

为:晴天状态(Sunny State),下雨状态(Rainy State),刮风状态(Windy State),下雪(Snowing State)。在晴天状态,阳光普照;在雨天状态乌云密布,下雨不停;在刮风状态,大风刮得天昏地暗;在下雪状态,大雪纷飞。用状态模式封装天气状态。为了表达天有不测风云的思想,假设天气状态是随机改变的,即在四种状态之间的切换是根本没有规律可循的,因此,考虑在抽象类WeatherState中的方法changeState(Context cxt)的实现中,使用能产生随机整数的Random类。因此,具体状态的改变,由抽象类WeatherState负责实现。请采用常规的状态模式进行设计,画出设计类图。 WeatherState -ctx: Context

state +createStateObj() Context +changeState(Context cxt ):void

-state: WeatherState +setState():String +getCurrentState():String +getState() +action(): String +doAction():void

SunnyState WindyState RainyState SnowingState +action():String +action(): String +act(): String +act(): String

+changeState() +changeState() +changeState() +changeState() +setState():String +setState():String +setState():String +setState():String

20. 随机生成一个整数矩阵,矩阵可以看做是聚合类型的数据。使用迭代器模式设计,对该

矩阵进行不同的遍历:(1)奇数遍历(OddIterator),访问并统计矩阵中的所有奇数。(2)偶数遍历(EvenIterator),访问并统计矩阵中的所有偶数。(3)斜对角线遍历(DiagonalIterator), 按照斜对角线迭代遍历矩阵。请应用迭代器模式进行设计,画出设计类图。

21.

室内温度控制软件设计。室内温度控制需要具备窗户、风扇、空调的自动开启与关闭功能。因此,该应用需要设计三个类,分别用于封装窗户、风扇、空调。请利用命令模式设计该应用,画出设计类图。

22. 下图所示是一个调用排序算法的设计图。在实现时,调用者Invoker通过条件判断语句调用

相应的排序算法,调用者Invoker和接收者Receiver之间是紧耦合的。

请使用命令模式在Invoker与Receiver之间进行解耦,设计相应的类,并绘制设计类图。

(四) 第6章 体系结构

23.

设计一个机场信息系统。在该系统中有一个AirPortInfo类负责维持机场信息,例如飞机到达时间、起飞时间、延迟信息、气象信息、航班取消信息等。假设有两个依赖于这些信息的类:VoiceInfo类,负责从AirportInfo类自动获取语音机场信息,然后将这些信息传送给乘客;DisplayInfo类,负责从AirportInfo类自动获取文字机场信息,然后将这些信息显示在屏幕上。请使用观察者模式设计该问题,画出设计类图。

<>Observable-notifies11..*<>Observer+addObserver(in observer : Observer)+setChanged()+notifyObservers(in event : Object)+update(in o : Observable, in e : Object)AirPortInfoVoiceInfo+addObserver(in observer : Observer)+setChanged()+notifyObservers(in event : Object)11+update(in o : Observable, in e : Object)1..*DisplayInfo+update(in o : Observable, in e : Object)1..*

24. 使用管道-过滤器体系结构设计与实现一个处理职员收入信息的软件。程序应该按照如下方

式对输入文件employee.txt进行处理:(1)按照职员工资金额对文件内容进行排序;(2)找出年薪在120000元以上的所有员工;(3)计算那些年薪在120000以上的职员的个人所得税,税率为30%。(4)打印出年薪在120000以上的职员的税收信息。要求:(1)画出设计的对象逻辑图;(4分)(2)画出设计类图,包括类中所包含的所有方法。

25.

设计一个控制金鱼缸水质、水温与水位高度的软件系统。基本需求:该程序用于自动控制金鱼缸中的水质、水温与水位高度。系统硬件包含鱼缸、化学传感器、水温传感器与水位传感器。当化学传感器的读数超过某种范围时,鱼缸需要排除部分废水,同时补充新鲜的水;当水温传感器读书低于某温度,或者超过某温度值时,需要开启加热设别或者了冷却设备调整水温;当水位读数高于或者低于特定高度时,需要开启排水设备,排除部分水或者添加新鲜的水。要求使用观察者模式设计该软件系统,请画出设计类图。

26.

使用管道-过滤器软件体系结构设计以下问题。要求:在设计的在线销售系统中,新的订单以消息形式送达企业。该消息被加密,包含数字证书形式的认证信息,并且可能有重复发送消息的情况发生。系统功能包括:(1)输入客户订单信息。(2)对该消息进行加密。(3)检查认证信息。(4)检查是否有重复发送的消息,如果被复制的消息发送了,则取消重复的订单,仅保留一份订单。要求:(1)画出设计的(管道)逻辑图;(2)画出设计类图,包括所有的类的设计与方法。