第7章软件体系结构风格与设计模式1前言1、软件体系结构是软件工程的一个重要研究内容2、软件体系结构的设计是软件开发中的一个关键环节,是软件质量的重要保证。3、软件体系结构已经成为一个重要的研究方向和独立的学科分支。4、软件体系结构对软件的总体结构进行清晰的描述和分析、并用它指导软件的后续开发。5、模式的本质:可解决一类问题并能重复使用的解决方案内容7.1基本概念7.2软件体系结构描述语言7.3软件体系结构风格7.4设计模式基本概念软件设计模式:广义定义:可解决一类软件问题并能重复使用的软件设计方案狭义定义:设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。是在类和对象的层次描述的可重复使用的软件设计问题解决方案。基本概念软件体系结构风格:是在构件和连接子的层次所描述的可重复使用的软件设计问题解决方案。基本概念二者的共性和区别:区别:1、设计模式是在类和对象的层次描述问题,粒度较小;2、体系结构风格是在构件和连接子的层次描述问题,粒度较大。体系结构风格是广义上的设计模式。共性:都是可重复使用的软件设计问题解决方案内容7.1基本概念7.2软件体系结构描述语言7.3软件体系结构风格7.4设计模式软件体系结构描述语言软件体系结构描述语言ArchitecturalDescriptionLanguage,简称ADL是用来描述软件密集型系统的总体结构的语言,说明系统众多部件之间的结构关系。代表性的体系结构描述语言WrightRapideDarwinUniconACMEABC/ADLXYZ/ADLXADL大部分结构描述语言都有构件、连接子、配置等概念软件体系结构描述语言WrightADL构件(Component)连接子(Connector)端口(Ports)构件规范(Component-spec)计算(Computation)配置(Configuration)角色(Roles)粘连(Glue)实例(Instances)联接(Attachments)WrightADL过程调用实例:一个Caller类型的构件c通过D-C-connector类型的连接子dc调用Definer类型的构件dc调用d调用实例的Wright体系结构描述图形化的体系结构描述语言GADLGADL的元模型ConceptualConfigurationCComponentCConnectorCPortCRoleProtocol11110..10..10..10..10..10..1****************cbindingconnectioncbindingobeyobey图形化的体系结构描述语言GADL调用实例的GADL体系结构描述—构件图c:Callerd:Definerdc:D-C-connectorprovidecallerdefinerrequest构件连接子端口角色图形化的体系结构描述语言GADL调用实例的GADL体系结构描述—类图图形化的体系结构描述语言GADL一个图形化的体系结构描述语言GADL调用实例的GADL体系结构描述—协议类图和顺序图protocolProcedureCall-1/port:ProcedureCall-1/role:ProcedureCall-1portprovide:callrequired:returnroleprovide:returnrequired:callcallreturnWright与GADLGADL语言用构件图、类图、顺序图等方式描述系统的软件体系结构,对行为的描述GADL用顺序图,而Wright用进行代数CSP。内容7.1基本概念7.2软件体系结构描述语言7.3软件体系结构风格7.4设计模式软件体系结构风格在构件和连接子的层次上描述的可重复使用的软件设计问题解决方案。1.管道/过滤器风格2.层次风格3.客户/服务器风格核心特征、应用场景、注意的问题(1)管道/过滤器风格实例剖析:统计a.txt中单词的个数并打印出来:shell命令:“cata.txt|wc-w|lpr”cat:Sourcewc:Filterlpr:Sinkp1:Pipep2:Pipeentryexitoutputoutputinputinputentryexit1、cat命令输出a.txt的内容2、通过管道传给命令wc,统计输入流中单词的个数并输出3、输出的单词数通过管道传给命令lpr,lpr将其打印出来构件图命令是构件、管道是连接子(1)管道/过滤器风格实例剖析:shell命令:“cata.txt|wc-w|lpr”类图(1)管道/过滤器风格实例剖析:shell命令:“cata.txt|wc-w|lpr”protocolWriteDataportrequire:write()/port:WriteData/role:WriteDatawrite()succeedfailed若管道中已没有空间,则返回“失败”roleprovided:write()WriteData协议类图和顺序图(1)管道/过滤器风格实例剖析:shell命令:“cata.txt|wc-w|lpr”protocolReadData/port:ReadData/role:ReadDataread()portrequire:read()roleprovided:read()ReadData协议类图和顺序图(1)管道/过滤器风格实例剖析:打印a.txt中soft的个数“cata.txt|grep-osoft|wc-w|lpr”wc:Filtercat:Sourcegrep:Filterlpr:Sinkp1:Pipep3:Pipeentryexitoutputoutputinputinputentryexitp2:Pipeentryexitoutputinput构件图(1)管道/过滤器风格特征:系统中构件之间通过数据流松散耦合。也就是说,构件之间的依赖仅仅是数据流,而不是通常的接口函数调用或消息传递。其他典型应用:编译器、信号处理等。其他说明:本模式在实现上可以有许多不同的变化,如主动与被动、多出口管道等。(2)层次风格实例剖析:数据库系统用户接口(查询、创建等)数据库管理数据库文件(文件管理功能)文件管理外部设备(设备管理功能)设备管理(2)层次风格实例剖析:数据库系统:DataBaseManage:FileManage:DeviceManage:DataBaseSystem:ProcedureCall:ProcedureCalldb数据库服务端口db(2)层次风格特征:从向外提供服务的构件出发,沿着连接关系递次搜索各构件和连接子,如果形成的拓扑结构是一个有向无圈图(典型情况下是一个线性结构),那么这个系统的体系结构风格就是层次式的。这种设计风格便于将复杂的系统进行分解;同时也便于构件替换:只要保持接口一致,就可以将某一层的软件替换掉,而不会影响到系统的其他部分。(2)层次风格其他典型应用:开放系统互联(OSI)七层网络模型、WindowsNT操作系统的内核结构。应用层表示层:ProcedureCall物理层:ProcedureCall应用层表示层:ProcedureCall物理层:ProcedureCall网线层1层2层7(2)层次风格其他说明:优点是结构清晰、可替换性好、便于控制复杂性;但也有它的缺点,如效率低:分层结构中高层的数据要经过层层传递和转发,从而降低系统效率。(3)客户/服务器风格实例剖析:FTP系统b:FtpClient:FtpServer:Networkc:FtpClienta:FtpClientuser1user2user3(3)客户/服务器风格特征:从向外提供服务的构件出发,沿着连接关系递次搜索各构件和连接子,如果形成的拓扑结构是一棵倒置的树,那么这个系统的体系结构就是客户/服务器风格的。这种风格使得服务功能的实现很集中,便于系统实现,因而得到广泛使用。(3)客户/服务器风格其他典型应用:电子邮件系统、系统、TELNET系统、CVS版本控制系统等浏览器::Browsera:Browseruser1user2user3:AppServer:Network2:DBServer:Network3e:CVSClient:CVSServer:Network1f:CVSClientd:CVSClientuser4user5user6数据库服务器可以向多个浏览器实例提供服务、还可以向CVS系统提供服务。(3)客户/服务器风格其他说明:在客户/服务器风格的系统中,服务器是资源和计算的集中地,因此容易成为存储和计算瓶颈,实际应用中为了提高服务器的性能,可能要采用集群处理等办法。同时,这个特点也使得这类系统容易遭受拒绝服务(DenyOfService)攻击,因此在设计和应用中要作针对性考虑。此外,在这种风格的系统中,服务器中往往要存储更多客户的状态信息,因此大量使用并发执行技术,如多进程、多线程等,这也就涉及到进程、线程的动态创建、调度、删除等问题。这些问题处理得好坏直接影响到服务器的性能。内容7.1基本概念7.2软件体系结构描述语言7.3软件体系结构风格7.4设计模式设计模式文献[7-2]中描述了23个设计模式,并将它们分为三种类型:创建型设计模式、结构型设计模式和行为型设计模式。设计模式1.FactoryMethod(工厂方法)2.AbstractFactory(抽象工厂)3.Singleton(单件)4.Composite(组合)5.Proxy(代理)6.Iterator(迭代器)7.Observer(观察者)动机和实例、应用场合、结构、核心思想(1)FactoryMethod动机与实例:“龙珠”游戏魔力管道:弹球(pop)制造球(Enchant)球(1)FactoryMethod动机与实例:“龙珠”游戏-设计1+Pop()#Enchant()MagicPipeBall...Ball*ball=newBall;...BallRubberBallSteelBall球有多种,如皮球、钢球Ball抽象父类Ball无法被实例化?(1)FactoryMethod动机与实例:“龙珠”游戏-设计2newBall动作包装成虚函数MakeBallFactoryMethod在子类(描述各种魔力管道)中重新定义该虚函数(1)FactoryMethod适用场合:有一些实体(各种魔力管道),它们的结构和行为是相似的,且都包含一些相似的更小实体(各类球),但一个大实体内部的这些小实体都是同一类的(一种魔力管道内只有一种球)。此时,如果各类小实体的描述构成一个类层次,那么可使用FactoryMethod模式,将各类大实体也描述为一个类层次。(1)FactoryMethod结构:FactoryMethod()PublicOperation()BigEntityFactoryMethod()ConcreteBigEntitySmallEntityConcreteSmallEntity...smallEntity=FactoryMethod()...returnnewConcreteSmallEntity(1)FactoryMethod核心思想归纳:在父类中,将创建对象的操作包装为一个虚函数,在描述公共行为的过程中调用该函数;在子类中重定义该虚函数来定制创建的对象,从而间接定制公共行为。利用虚函数的多态机制,FactoryMethod模式使得父类可集中描述公共行为,而将特别行为(不同对象的创建)抽放于子类。(2)AbstractFactory动机与实例:魔力管道。在前面的设计中,三个MakeBallFactoryMethod工厂方法散放在三个MagicPipe类中。为了降低复杂性,可以把所有的创建动作拆分出来单独考虑。即:创建球