版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章软件体系结构 本章从面向对象分析和设计入手,掌握的类图设计器。以组件、模式的形式来学习和研究软件体系结构,最后介绍在.NET环境下怎样设计、建立和实现软件体系结构的3层结构。 10.1面向对象的分析和设计面向对象的思想是把世界上的事物都看成对象,复杂的对象由简单的对象组成。我们还可以把世界上的事物分成类,这些类就是对象的集合。类可以包含子类,类由成员组成,字段、属性、方法、接口、事件都是成员。对象是类的实例,对象的集合是一个类。每个对象都由特定的状态(字段值)、属性(设置与获取字段值)、方法(完成对象功能)、接口(对象与外界的联系)和事件(对象与周围的通讯和突发事件的处理)组成。面向对象的分析就是要从现实世界中发现对象、提取对象并归类,研究类与类、类与对象、对象与对象之间的关系。
面向对象的分析简称OOA,面向对象的设计简称OOD,面向对象分析和设计析简称OOAD下面给出一个准确的定义: 面向对象分析:利用面向对象的思想,抽象出软件中所需要的对象和分析出软件所需实现的功能。 面向对象设计:根据软件的功能分析出软件对象的关系并画出软件设计图(例如,UML图)。类与类之间的关系其实只有两种情况:一种是关联:例如,A类对象调用B类对象。一种是组合:聚合:A类中定义B类、B类中又定义了C类。继承:A类中继承了B类。 1面向对象的分析工作1)预算和计划2)找出对象3)分析业务流程,一般用用例图。 2面向对象设计工作根据分析结果,画出设计图,一般用UML类图[见UML类图]、对象图或数据流图、流程图等。 3掌握的类图设计器的使用鼠标点击解决方案→鼠标右击要查看的项目→点击“查看类关系图”,显示如图10.1所示。
从图中可以看到与类图相关的图有两个,一个是类图显示窗口和一个是工具箱“类图设计器”窗口,如果你还想看“类详细信息”窗口,可以用鼠标右键点击任意一个类图,再点击““类详细信息”,就可以看见类的详细信息了,如图10.2所示。
下面设计一个有类关联和组合的家庭类图。如图10.3所示。
10.2软件的体系结构 软件体系结构(softwareArchitecture)是软件系统与子系统、组件以及它们之间相互关系的描述。换句话说,软件体系结构就是软件系统的架构。 面向对象的软件开发就像搭积木一样,最小的积木是类、接口、结构等,大一点的是组件,再大一点的就是本节要讨论的内容。下面我们通过组件的定义、软件的模式、软件的设计和实现方法进行介绍。
1组件的定义 组件就是一个封装的可执行的软件模块,最小的组件就是一个类或对象,类似一块积木,COM、程序集是中型组件,大型组件包括工作流组件、服务组件甚至到一个软件系统。组件的一个重要特性是可交换性,这一特性可用于软件系统的升级、维护和更新。要做到可交换性,一方面要求两个组件的接口完全兼容,数据类型要一致,运行此两个组件的环境还要兼容。另一方面组件之间的依赖性越小越好,只有组件的独立性好,才好更换。
2模式简单说,模式就是模型和样式。模式又分体系模式和设计模式。体系模式是设计软件结构时经常使用的方案、例如,三层架构就属于体系模式。设计模式是指构建一个小的组件或项目时的解决方案。设计模式可以直接影响到编码,它可以提供给一些经典的代码结构。设计模式比体系模式小。下面举一个经典的设计模式的例子,单例模式。它的特点是,每次运行只有一个实例。其程序如下:usingSystem;usingSystem.Text;class单例类{privatestring消息=string.Empty;privatestatic单例类实例=null;private单例类(stringmsg){消息=msg;}publicstatic单例类获得实例(strings){//注意这里,只允许一个实例
if(实例==null)实例=new单例类(s);return实例;}publicvoid展示(){Console.WriteLine(消息);}}classProgram{staticvoidMain(string[]args){单例类例1=单例类.获得实例("实例1");
例1.展示();
单例类例2=单例类.获得实例("实例2");
例2.展示();}}
运行后,输出结果为:实例1实例1下面再举一个工厂模式的例子usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceProductDesign{enumTYPE{上汽,一汽,长安};abstractclass汽车
{publicabstractstringName{get;}publicabstractvoidRun();}
class上汽:汽车
{privatestringname=string.Empty;publicoverridestringName{get{returnname;}}publicoverridevoidRun(){Console.WriteLine("{0}起跑!",name);}public上汽(stringsname){name=sname;}}class一汽:汽车
{privatestringname=string.Empty;publicoverridestringName{get{returnname;}}publicoverridevoidRun(){Console.WriteLine("{0}起跑!",name);}public一汽(stringsname){name=sname;}}class长安:汽车
{privatestringname=string.Empty;publicoverridestringName{get{returnname;}}publicoverridevoidRun(){Console.WriteLine("{0}起跑!",name);}public长安(stringsname){name=sname;}}
abstractclassCreator{publicstatic汽车获得汽车(TYPEtype,stringname){switch(type){caseTYPE.上汽:returnnew上汽(name);caseTYPE.一汽:returnnew一汽(name);caseTYPE.长安:returnnew长安(name);}returnnull;}}
classProgram{staticvoidMain(string[]args){
汽车车1=Creator.获得汽车(TYPE.上汽,"朗逸");
汽车车2=Creator.获得汽车(TYPE.一汽,"红旗");
汽车车3=Creator.获得汽车(TYPE.长安,"福特");List<汽车>汽车=newList<汽车>();
汽车.Add(车1);
汽车.Add(车2);
汽车.Add(车3);foreach(汽车车in汽车)车.Run();}}} 10.2
软件的设计原则软件的设计原则是开放软件需要注意到的问题,是用来衡量一个软件质量好坏的标准,就好象国家或政党的政策和策略(为人民服务、千万不要忘记阶级斗争、三个代表)、一个人对社会的认识(水可载舟也可覆舟、群众是真正的英雄。。。、人民,只有人民。。。)、道德品质和处事原则一样重要(例如,三好学生标准、公诚勇毅、力气用了力气在、劳动创造人类、勤劳致富)
。一定要深刻理解和贯彻执行。下面就列举这些设计原则:1模块独立性好。每个软件元素(类或组件)表达一个单独的意图。模块之间“低耦合高类聚”。2代码易理解、可读性高。它涉及到软件的可维护性和开发时的合作。3一致性好。容易形成风格、模式,团队编程效率才高。4一次性原则。不要两个类或代码做相同的事情,避免逻辑上和结构上的重复。5从简原则。完成同样功能,越简单就越好。(例如,不管白猫黑猫,抓到老鼠就是好猫)6减法原则。当你不能从你的设计中去掉任何东西时,这个设计就算完成了。(多一事不如少一事)
10.3三层架构 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,如图10.4所示。从下至上分别为:数据访问层、业务逻辑层、表示层。所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。表示层业务逻辑层数据访问层数据库图10.4三层架构模型
表示层:是系统的用户界面部分,负责使用者与整个系统的交互。在这一层中,理想的状态是不应包括系统的业务逻辑。表示层中的逻辑代码,仅与界面元素有关。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。业务逻辑层:业务逻辑层(BusinessLogicLayer)无疑是系统架构中体现核心价值的部分。它处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。业务逻辑层的设计对于一个支持可扩展的架构尤为关键,因为它扮演了两个不同的角色。对于数据访问层而言,它是调用者;对于表示层而言,它却是被调用者。
数据访问层:其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。简单的说法就是实现对数据表的查询、增加、更新和删除操作。下面介绍一个三层架构的商务网站“唐风商城网站”的设计和实现。在第9章中,我们介绍了“唐风商城网站”的程序结构(名字空间结构)、唐风网站程序的9个项目以及它们之间的引用关系。并且描述了如何建立系统、实现互相引用的全部过程。下面我们着重分析系统是怎样实现3层结构的。从图9.2唐风网站程序的9个项目之间的引用关系看到:
网站WEB:很明显是系统的表示层,用户可以在此层输入和展示商品信息。网站程序包含启动程序(dafault.aspx,index.aspx)、配置文件(web.config)、样式文件(*.SCC文件)、其他.NET程序(*.aspx)、*.HTML文件、图像和动画文件等。网站程序一般分为前台和后台。前台为用户使用,后台一般由管理员和超级用户使用。共有类418个。这些类被组织在如图9.1所描述的那样,是一颗树形结构。例如,默认(default)主页类的详细信息如图10.5所示。
业务逻辑(BLL):很显然属于业务逻辑层。就是将每个业务(实体)定义为一个类,在该类中定义相应的接口、构造函数和操作方法(例如,对表中的记录增加、修改、删除等)。业务逻辑由9个名字空间组成,如图9.1所示。每个名字空间又由若干类组成,唐风整个业务模型定义了89个类。例如,类AdvertiseManage的详细信息如图10.6所示。
下面再给出AdvertiseManage类的程序:usingSystem;usingSystem.Data;usingSystem.Collections.Generic;usingTFShop.Model.Accessories;usingTFShop.DALFactory;usingTFShop.IDAL.Accessories;namespaceTFShop.BLL.Accessories{///<summary>///广告管理业务逻辑层
///</summary>publicclassAdvertiseManage{privatereadonlyIAdvertiseManagedal=DataAccess.CreateAdvertiseManage();publicAdvertiseManage(){}#region成员方法
///<summary>///添加一条新广告
///</summary>///<paramname="model"></param>///<returns></returns>
publicintAdd(TFShop.Model.Accessories.AdvertiseManagemodel){returndal.Add(model);}///<summary>///更新一条数据
///</summary>///<paramname="model"></param>///<returns></returns>publicvoidAmend(TFShop.Model.Accessories.AdvertiseManagemodel){dal.Amend(model);}///<summary>///删除一条数据
///</summary>///<paramname="Id"></param>publicvoidDelete(intId){dal.Delete(Id);}
///<summary>///更新任意一个列
///</summary>///<paramname="id"></param>///<paramname="columnName"></param>///<paramname="value"></param>///<returns></returns>publicintAmend(intid,stringcolumnName,objectvalue){returndal.Amend(id,columnName,value);}///<summary>///得到一个实体
///</summary>///<paramname="id"></param>///<returns></returns>publicTFShop.Model.Accessories.AdvertiseManageGetModelByID(intid){returndal.GetModelByID(id);}
///<summary>///所有数据集合
///</summary>///<returns></returns>publicList<TFShop.Model.Accessories.AdvertiseManage>GetAll(){returndal.GetAll();}///<summary>///得到所有数据
///</summary>///<returns></returns>publicTF.DataBase.DataByPageGetList(){returndal.GetList();}#endregion}}
从上面的程序可以看到它使用了唐风商城.模型.附件(TFShop.Model.Accessories)、唐风商城.数据工厂(TFShop.DALFactory)和唐风商城.数据接口.附件(TFShop.IDAL.Accessories)。它利用数据工厂(DALfactory)定义的数据存取类(DataAccess)的CreateAdvertiseManage()的静态方法建立接口,然后利用这个接口的方法来完成广告业务功能。
数据工厂(DALfactory):属于数据访问层。定义数据存取类(DataAccess),在该类中为每一个数据表定义一个静态方法,该方法建立数据表对象,并将其转换为相应的接口返回。例如,定义广告静态方法,其程序如下:publicstaticTFShop.IDAL.Accessories.IAdvertiseManageCreateAdvertiseManage(){return(IAdvertiseManage)CreateObject("Accessories.AdvertiseManage");};
数据服务(SQLserverDAL):属于数据访问层。利用模型的参数、继承的接口,实现接口中的方法,来完成对数据库中表的增加、删除、更新、获取等操作。共有类85个,其中有11个类继承了DbBase这个类。DbBase这个类是定义数据库表名的前缀类。例如,商城类型ShopStyle
。该类的详细信息如图10.7所示。
对应的程序如下:ShopStyle.cs数据接口(IDAL):就是将数据库中的每一个表(实体)定义一个接口,每个接口定义对表的操作(例如,对表中的记录增加、修改、删除等),这些操作只定义方法名、参数个数和类型。所有接口由9个名字空间组成,如图9.1所示。每个名字空间又由若干接口组成,唐风整个定义了84个接口。例如,广告接口IAdvertiseManage,该接口的详细信息如图10.8所示。
对应程序如下:usingSystem;usingSystem.Data;usingSystem.Collections.Generic;namespaceTFShop.IDAL.Accessories{publicinterfaceIAdvertiseManage{///<summary>///增加一条数据
///</summary>intAdd(TFShop.Model.Accessories.AdvertiseManagemodel);
///更新一条数据
///</summary>voidAmend(TFShop.Model.Accessories.AdvertiseManagemodel);///<summary>///删除一条数据
///</summary>voidDelete(intId);
///<summary> ///任意修改一个字段
///</summary>intAmend(intid,stringcolumnName,Objectvalue);///<summary>///得到一个对象实体///</summary>TFShop.Model.Accessories.AdvertiseManageGetModelByID(intid);
///<summary>///获得所有数据集合
///</summary>///<returns></returns>List<TFShop.Model.Accessories.AdvertiseManage>GetAll();///<summary>///获得所有数据
///</summary>///<returns></returns>TF.DataBase.DataByPageGetList();}}模型(Model):属于数据层。就是将数据库中的表(实体)定义为类,用C#中的属性定义每一个字段以及构造函数。模型由9个名字空间组成,如图9.1所示。每个名字空间由若干类组成,唐风整个模型定义了89个类。例如,订单留言模型类OrderLeave的详细信息如图10.9所示。对应程序如下:usingSystem;namespaceTFShop.Model.Order{[Serializable]publicclassOrderLeave{publicOrderLeave(){}#regionModelprivateintid;privateint?memberid;
privatestringorderid;privatestringcontent;privateDateTime?createdate;privateint?state;//int?:表示可空类型,就是一种特殊的值类型,它的值可以为null///<summary>///留言ID///</summary>publicintID{set{id=value;}get{returnid;}}
///<summary>///会员ID///</summary>publicint?MemberId{set{memberid=value;}get{returnmemberid;}}///<summary>///订单ID///</summary>publicstringOrderId{set{orderid=value;}get{returnorderid;}}
///<summary>///留言内容
///</summary>publicstringContent{set{content=value;}get{returncontent;}}///<summary>///时间(是回复则是回复时间,是发送则是发送时间)///</summary>publicDateTime?CreateDate{set{createdate=value;}get{returncreatedate;}}
///<summary>///状态是(0代表后台回复件,1代表会员发送件)///</summary>publicint?State{set{state=value;}get{returnstate;}}#endregionModel}}
唐风(TF):由数据库、唐风网页和唐风公用3个名字空间组成。共有类29个。主要完成网站的核心系统。数据库(DataBase):数据库名字空间有3个类,它们与唐风网页和唐风公用的调用结构如图10.10所示。其功能如下:唐风网页、唐风公用、数据库
唐风网页唐风公用数据库网页数据类(DataByPage):将一个网页的数据用一个类来表示。一个网页是由页面和数据组成,网页数据类就是一个网页的数据集合。有些数据是存在数据库中的,通过该类可以将数据从数据库中取到并显示到页面上,在运行过程中,它需要调用其它名字空间、数据助手和服务助手类。调用关系如图10.11所示。
唐风网页唐风公用网页数据类服务助手类数据助手类服务助手类(SQLServerHelper):利用配置文件取到连接信息,利用连接信息、存储过程和数据表生成查询命令。利用事务、命令和参数执行查询语句,获得查询结果数据。数据助手类(DataHelper):利用数据库的SysObjects,SysColumns,Systype和表名取到表的字段名、类型、长度等表结构数据。利用SQL语句和参数取到表的数据集。唐风网页(WebPage):由8个类组成,它们分别为:主页类(BasePage):加风格(样式)表和展示主页的错误和内容。数据表类(DataTable):建立一张数据表(数据库中表的对应表)和获得数据表。数据视图类(DataView):获得数据视图。页请求类(PageRequest):获得主页的表(Form)和查询(Query)信息。脚本类(Script):生成javascript语句,这些语句的作用是把信息显示给用户并执行正确的转移操作命令。表类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳动合同法员工离职的规定2024年-
- 转租房屋租赁协议范例
- 房屋建设四邻合作协议
- 房地产开发承包合同
- 房地产项目抵押借款合同
- 房产认购协议书
- 新昌县茶叶种植收购合同汇编
- 2023年高考押题预测卷01浙江卷-生物(原卷版)
- 2023年高考地理第一次模拟考试卷-(天津A卷)(全解全析)
- 2023年高考地理复习精题精练-城镇化(解析版)
- 电动客车驱动桥总成设计
- 四川省阿坝藏族羌族自治州《综合知识》事业单位国考真题
- 2023年人民法院电子音像出版社招聘笔试题库及答案解析
- 大学生心理健康优秀说课-比赛课件
- 收款账户变更的声明
- 九年级道德与法治中考复习资料
- 《化学发展简史》学习心得
- 班组建设与班组长管理技巧课件
- 签派员执照考试题库汇总-8签派和实践应用
- 30屈原《楚辞·橘颂》课件
- 销售人员十大军规课件
评论
0/150
提交评论