




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章:应用框架,面向对象分析与设计,一、框架概述 二、应用框架应用 三、应用框架的特点 四、应用框架设计方法 五、实际应用,基于UML描述的应用框架模型,一、框架概述,应用框架就是:某特定应用领域(Domain)中,程序间的共同结构。让该领域中的设计人员、程序员,依共同结构来开发程序,使设计、程序之间具有一致性,增加了设计和程序的清晰度,以降低软件的设计与维护费用。 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计
2、、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。,一、框架概述,框架与应用框架 框架提供了所有应用期望的默认行为的类集合。具体的应用通过重写子类(该子类属于框架的默认行为)或组装对象来支持应用专用的行为。应用框架强调的是软件的设计重用性和系统的可扩充性,以缩短大型应用软件系统的开发周期,提高开发质量。与传统的基于类库的面向对象重用技术比较,应用框架更注重于面向专业领域的软件重用。应用框架具有领域相关性,构件根据框架进行复合而生成可运行的系统。框架的粒度越大,其中包含的领域知
3、识就更加完整。,一、框架概述,共同结构 所谓共同结构,包括了通用的类、对象、函数,及其之间的稳定关系。由于框架是通用的,大家能共享它,提高了工作效率,增加了软件工程师的生产力。拿个简单例子来说,两个长方形分别为直角及圆角,如下: 首先分辨它们的异同点,然后将其共同部分抽离出来,如下: 拷贝一份抽象图,在图之四角各加上,就成为,一、框架概述,从上所述,我们可知框架包括了: 一群抽象类,类里面有函数,函数内有指令,但有些函数内的指令缺省,预留给应用程序员以补充。 抽象类间的稳定关系。 然而,现在的框架,不只含抽象类,且含有具体类、函数、及对象。实际上,框架已涵括了传统类库的功能,使得大家不易区分框
4、架与类库之差别了。只能在理论上,区分两者如下:,应用框架 类库 目的: 让应用程序员派生出具 目的: 让程序员拿现成类来产生对象, 类并 体类 ,派生时可修正类, 才创 未预留空间给程序员来修正。 建对象。 应用框架中的类的方法,常 应用程序的方法只能调用类库中的方法, 调用应用程序中的方法。 反之不可。 含有类间的关系,其预设了 类是独立的,并未设定对象间的通信方式。 对象间的互助合作关系。 对象常含预设计行为,预设行 对象的行为都是固定的,无法修正。 为可让应用程序员修正。,一、框架概述,一、框架概述 二、应用框架应用 三、应用框架的特点 四、应用框架设计方法 五、实际应用,基于UML描述
5、的应用框架模型,Controller,Model,(Document),View,二、应用框架应用(Model-View-Controller FrameWork ),Microsoft Foundation Classes (MFC) FrameWork,CObject,CCommandTarget,CWinApp,CDocTemplate,CWnd,CDocument,CFrameWnd,CView,CDialog,CYourApp,CYourFrame,CYourView,CYourDlg,CYourDoc,MFCFrame Work Layer,Application Layer,二、
6、应用框架的应用,由于框架能大量地重复使用,并可不断修正它,因而提升了应用程序的弹性,也能提升系统程序的弹性。例如,在SOA系统上,弹性是极重要的。这种低层次的框架已成为热门话题。在框架技术方面,设计模式(Pattren) 理论(下一节重点介绍)逐渐应用到框架上,值得您密切注意。 目前的框架大多使用于非面向对象操作系统上,如OWL 及MFC都是。它们将非面向对象的Windows 包装起来,加上一层面向对象的外壳 ,让应用程序易于跟Windows 通信。 面向对象的操作系统本身就是可修正、有弹性的,而不是像Windows 、DOS 是固定的。这种操作系统提供了支持性的框架,让人们不但能使用操作系统
7、的API 函数,也可以修正之,使它符合客户的需要。这种支持性的框架,其观念与一般应用框架相同,只是它负责系统层次的任务,如计算机网络、分布式数据库的管理工作。一般,应用程序员并不直接修正支持性框架,而是由系统维护人员来修正它。,二、应用框架的应用,一、框架概述 二、应用框架应用 三、应用框架的特点 四、应用框架设计方法 五、实际应用,基于UML描述的应用框架模型,多态性 面向对象技术的重要一个特点是:大幅提升软件的弹性和重复使用性。多态性是实现这特点的关键技术,尤其在应用框架、分布式对象等环境里,其角色是极为重要的。多态性作为面向对象基本概念,也是面向对象语言必备的要素,若缺乏多态性,则该计算
8、机语言,就不能称得上面向对象语言了。从我们周围的生活实例去观察,会较容易了解多态概念。,三、应用框架的特点,反向调用 我们知道抽象类是框架技术的主角,应用框架中一个重要的令人着迷的地方是:框架里的函数能调用应用程序的函数,这是框架与一般类库(或链接库)的极重要区别。使用一般链接库时,程序中的函数调用了现成的库函数,但库函数不能反过来,调用您所写的函数。由于库函数设计在先,而您写程序在后;所以,您的函数调用库存函数,这种晚辈调用前辈的传统通信情形,我们已经非常熟悉。应用框架除了能进行传统通信外,还提供新方法:前辈调用晚辈。虽然前辈(应用框架)创建时,晚辈(应用程序)尚未创建;但是前辈有时候可预知
9、晚辈中的函数,就可调用它。这种功能,具有下述效果: 框架能事先定义许多预设(Default) 函数。 应用程序员的主要工作是:设计函数供框架来调用。这些函数可修正或取代框架中的函数。 如果程序中的函数已修正或取代预设函数,框架就调用程序中的函数;反之则调用预设函数。,三、应用框架的特点,三、应用框架的特点,抽象类 抽象一词常令人觉得那是难以体会的事。在应用框架上,如果您把抽象定义为抽出共同的特征,那就比较容易理解了。抽象类是面向对象中重要的概念,用途非常广,这一节我们主要使用C+语言来描述一些概念。怎样得到抽象类,比如,观察两个相似的类,并分辨其相同与相异点,然后把相同点抽离出来,构成父类,就
10、是抽象类了。由于这过程很简单,就广义上而言,都要经过下述过程: Step 1. 观察几个相似的类。 Step 2. 分辨它们的异同点。 Step 3. 把它们的相同点抽离出来。 而导出的父类都称为抽象类。然而软件中,对抽象类采取较严格的定义。其定义为:如果在类中,有些函数是不完整的,就称为抽象类。 反之,如果类中的函数,都是完整的,就称为具体类。所谓不完整,就是函数的内容从缺,例如: class Person public: virtual void Display()=0; ; Display()=0 指令的 “=0” 符号,表示此为纯粹虚拟函数。这种函数内的指令从缺,等待子类来补充。因此,
11、C+ 有个更明确的定义: 凡类中含有纯粹虚拟函数,就是抽象类。,抽象类 也得注意:子类并不见得是具体类,例如: class Person public: virtual void Display()=0; ; class Employee : public Person . public: . ; 这Employee是个子类,但它未将Display() 函数充实完整,仍是个抽象类。,三、应用框架的特点,例如, #include class Person protected: char name20; public: void SetName( char* na ) strcpy( name,
12、na ); virtual void Display()=0; ; class Customer : public Person public: virtual void Display() cout Customer: name endl; ;,三、应用框架的特点,Customer类将Display() 函数补充完整了,Customer成为具体类。这Display() 函数仍是虚拟函数,但已不是纯粹虚拟函数了。由于抽象类的某些函数并不完整,若此类创建其对象,则该对象无法表达出某些行为,所以C+ 禁止其创建对象,这是抽象类与具体类的重要区别。 抽象类的目的供具体类来继承它,但不用来创建对象。
13、具体类之目的创建对象。 抽象类不能用于创建对象,应注意下述限制: 不能做为数据成员的类型。例如, #include class Company Person president; public: ; void main() Company c; president 是Company 类的数据成员,当Company 类派生其对象时,也得派生president 对象,这是C+ 所不允许的。,三、应用框架的特点,不能做为自变量的类型 。例如, #include void disp( Person p ) p.SetName( Tom ); void main() Person x; disp( x
14、); 这含有两个错误:指令 Person 无法派生自动对象 x。 自变量 p Person 欲派生p 对象;但自变量也是自动对象,C+ 并不允许。如果 Person 为具体类就对了。,三、应用框架的特点,不可做为函数的类型 。例如, Person Sub( Person p ) return p; Sub() 函数将传回p 对象的内容,此时必需派生暂时的Person对象来接受return传来的对象内容。但Person无法派生暂时对象,所以错了。若改为: Customer Sub( Customer c ) return c; 就可以了。,三、应用框架的特点,不能用来转换对象的类型。例如, #i
15、nclude void main() Customer cust; cust.SetName( Linda ); (Person)cust).SetName( Jacky ); (Person) cust 指令将派生Person的临时对象,再将cust对象值转换并存入该临时对象中,但Person无法产生该临时对象,所以错了。,三、应用框架的特点,抽象类正确的使用如下几条: 使用抽象类指针来指向子类的对象。例如, #include #include ex04-01.h / 引用类Person和Customer void main() Customer cust; cust.SetName( Li
16、nda ); Person* p = 此程序声明了抽象类的指针p ,并令p 指向子类的对象cust。 所以,执行时输出: Customer: Linda 。,三、应用框架的特点,指针可以当做函数的自变量 。例如, #include #include ex04-01.h / class Person and Customer void Set( Person* p ) p-SetName( Amy ); void main() Customer cust; cust.SetName( Linda ); Set( 此时p 指向cust对象,是正确的。 此程序输出: Customer: Amy 。,
17、三、应用框架的特点,函数可以回传抽象类的指针 。例如, #include / class Person and Customer Person* sub() Customer* pc = new Customer(); pc-SetName( Tom ); return (Person*)pc; void main() sub()-Display(); delete sub(); 此程序输出:Customer: Tom 。 return指令将 pc 值转为 Person*类型的指针,然后传回来,于是sub() 值为Person类的指针,正指向new 所产生的对象。,三、应用框架的特点,一、框架
18、概述 二、应用框架应用 三、应用框架的特点 四、应用框架设计方法 五、实际应用,基于UML描述的应用框架模型,能声明抽象类的引用(Reference) 。 由于引用与指针是一体的两面,引用的本质是指针,所以C+ 允许: 声明抽象类的引用。 抽象类的引用可以做为函数的自变量。 函数可以传回抽象类的引用值。 #include / class Person and Customer Person 此程序输出: Customer: John。 其中, sub() x cust 。所以sub(cust).Display() 指令相当于 cust.Display()。,四、应用框架的特点,双向通信(正向通
19、信) 传统的链接库(Function Library)及类库(Class Library) 只提供单向通信,而应用框架则提供双向通信。应用框架也提供了正向通信方法。例如,假设前面所谈过的Person及Customer两类已存于应用框架中,则可写程序如下: class VIP : public Customer char tel15; public: VIP( char* na, char* t ) SetName( na ); strcpy( tel, t ); virtual void Display() Customer:Display(); cout TEL: tel endl; ; v
20、oid main() VIP v( “Zhengwei, ); v.Display(); 执行时输出: Customer: Zhengwei TEL:四、应用框架的设计方法,双向通信(反向通信) 前辈调用晚辈。这种情形称为反向通信。例如,假设框架中增加了Product服务类如下: class Product protected: int pno; Customer* pc; public: Product( int no ) pno = no; void SoldTo( Customer,四、应用框架的设计方法,VIP程序如下: #inclu
21、de / class Person and Customer class Product class VIP : public Customer char tel15; public: VIP( char* na, char* t ) SetName( na ); strcpy( tel, t ); virtual void Display() Customer:Display(); cout TEL: tel endl; ;,class TV : public Product double price; public: TV( int no, double pr ) : Product( n
22、o ) price = pr; virtual void Print() cout TV No: pno endl; cout Price: price endl; ; void main() /客户程序 TV t( 1100, 1800.5 ); VIP vp( “Dthree,); t.SoldTo(vp); t.Inquire(); ,结果 执行时输出: TV No: 1100 Price: 1800.5 sold to. Customer: Dthree TEL:这程序展现了应用框架的现象: 程序执行时,主控权在框架手上。 虽然mai
23、n()函数仍为程序的启动者,但主要的处理过程都摆在Product 类内。例如, SoldTo()负责搭配产品与顾客之间的关系。 Inquire() 负责调用TV的Print() 输出产品数据,并调用VIP 的Display() 输出顾客数据。 程序里的类,其成员函数,主要是供框架调用。 例如,TV类的Print() 供Inquire() 调用,而VIP 类的Display() 供Inquire() 调用。 由于框架掌握主控权,复杂的指令都摆在框架中,其大幅简化了应用程序。因此,优良的应用框架常让程序员如虎添翼。 框架里的Inquire() 进行反向通信,它调用子类的Print() 函数。 这是
24、同体系内的反向调用。 框架里的Inquire() 反向调用VIP 的Display() 函数。 因Product 与VIP 分属不同的类体系。这是跨越体系的反向通信。,四、应用框架的设计方法,分析 这两种反向调用,都是依赖幕后助手虚拟函数,才能实现。 由于TV的Print() 及VIP 类的Display() 都是虚拟函数,所以框架中的Inquire() 能调用它们。 请看上述第1 种反向调用吧:Product父类设计在先,然后才派生TV子类,且由不同人所设计。为什么Product 的Inquire() 能调用 TV 的Print() 函数呢?万一TV类并无Print() 时,怎么办呢?答案很
25、简单: TV必须定义Print() 函数,才能成为具体类。 TV成为具体类,才能派生对象。 有了对象才能调用Inquire() 函数。 既然TV已有Print() 函数,当然Inquire() 能调用它。 现在已确定TV中必有个Print() 函数了。但另一个问题是:为什么Print() 必须是虚拟函数呢?若将之声明为一般函数,难道不行吗?答案是: TV的对象调用Inquire() 函数。 Print() 必须是虚拟函数,才能确保Inquire() 会反向调用到该对象的Print() ,亦即调用到TV类的Print() 。,四、应用框架的设计方法,假如将Print() 声明为一般函数,则Inq
26、uire() 会调用到Product 类的Print() 。例如, #include class Product int pno; public: Product( int no ) pno = no; void Inquire() Print(); void Print() cout This is Product:Print()n; ; class TV : public Product double price; public: TV( int no, double pr ) : Product( no ) price = pr; void Print() cout This is TV
27、:Print()n; ; void main() TV t( 1100, 1800.5 ); t.Inquire(); 此程序输出: This is Product:Print()。,四、应用框架的设计方法,跨体系的反向调用 接下来,看看Product 的Inquire() 调用VIP:Display()函数。Product 与VIP 并非同一个类体系,这两个函数不能直接调用,而必须经由指针来调用。此时, VIP 必须是具体类才能派生对象。 pc指针必须指向刚派生的对象。 由pc所指向之对象来调用Display() 函数。 如此,Inquire() 就透过pc而成功地调用到VIP 的Displ
28、ay() 函数了。 这过程有个先决条件Display() 必须是虚拟函数才行。假若将Display() 声明为一般函数,则会调用到Customer类的Display() ,而不是调用到VIP 的Display() 函数。此时并未进行反向调用! 为什么会调用到Customer:Display() 呢?答案是:pc指针的类型为Customer* ,就直接到Customer类去找Display() 函数。 也许,您还会问一个问题:何不将pc指针改声明为 VIP* 类型呢?答案是:别忘了,框架是前辈,产生在先;应用框架是晚辈,产生在后。因此,设计Product 类的时候,VIP 类尚未派生。 为了更清
29、楚地了解反向通信情形,请再看个程序。首先,为框架增加一个函数如下: void DoInquire( Product* p ) p-Inquire(); ,四、应用框架的设计方法,抽象类与具体类结合 虽然应用框架中的主角是抽象类,但也常含有具体类,如上述的Customer类就是。此外,也常含有公用函数,如上述DoInquire() 就是。甚至,必要时您可拿框架中的具体类(如 Customer )来派生对象,并摆在框架中,成为公用对象,供程序来使用之。于是,可由这框架派生出子类,如下:,四、应用框架的设计方法,一、框架概述 二、应用框架应用 三、应用框架的特点 四、应用框架设计方法 五、实际应用,
30、基于UML描述的应用框架模型,MFC: 本节将说明MFC框架的核心类体系,并分析其预设函数及反向沟通。MFC 框架的核心类体系为:,五、实战锦囊,CWinApp 为具体类,可直接拿来派生对象如下: #include CWinApp App; App 是 CWinApp的对象,这对象派生时,框架中有个指针appCurrentWinApp会指向它。,五、实战锦囊,您可通过框架中的公用函数 AfxGetApp()来取得该指针值。例如指令 AfxGetApp()-Run(),就调用了App 对象的Run() 函数。也许您会觉得奇怪:上述程序好像缺少了main()函数,是不?答案是:框架中已经预设了Wi
31、nMain() 函数。请看这WinMain() 的内容,WinMain() . AfxGetApp()-InitInstance(); . AfxGetApp()-Run(); 程序指令AfxGetApp()-InitInstance();相当于: App.InitInstance(); 也就是调用了CWinApp 类的InitInstance()函数。这 InitInstance() 是框架中的预设函数,其内容为: InitInstance() return TRUE; 这预设函数并未做什么事,但它是虚拟函数,您可定义新函数来取而代。接着,程序指令AfxGetApp()-Run(); 相当于
32、: App.Run(); 这 Run()是框架中的预设虚拟函数,其内容为: Run() . for(; ;) . if( !PumpMessage() ) break; ,五、实战锦囊,由此可知,框架和应用程序的调用关系图示如下:,五、实战锦囊,请看看Run() 的内容。其中有个 for(; ;) 循环,它负责接待Windows 传来的消息,并将消息转送CFrameWnd 的对象。但是上述程序中,并未派生CFrameWnd 的对象,就无法转送消息了,屏幕上也看不到窗口。那该怎么办呢?答案是:定义新的InitInstance()函数来取代预设函数。于是,派生子类如下:,五、实战锦囊,现用C+ 表达如下: #include class YWindow : public CframeWnd public: YWindow() Create( NULL, YWin ); ;,五、实战锦囊,class YApp : public CWinApp virtual BOOL InitInstance() m_pMainWnd = new YWindow; m_pMainWnd-ShowWindow( m_nCmdShow ); return 1; ; YApp App; /end,五、实战锦囊,于是,由程序指令 m_pMainWnd = new YWindow 建立如下关系:,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐饮业食品安全管理体系认证合同
- 小米c面试题及答案
- 市容环卫外包方案
- 轻工产品仓储仓单质押担保协议
- 汽车售后服务网点车辆订购及维修服务合同
- 社区改造设计建筑方案
- 生态造林工程投标方案
- 党章知识课件
- 数学小升初面试题及答案
- 体育协会换届方案
- 高中历史《第一次工业革命》说课课件
- 预计财务报表编制及分析课件
- 学生集体外出活动备案表
- Q∕SY 1347-2010 石油化工蒸汽透平式压缩机组节能监测方法
- 基于Qt的俄罗斯方块的设计(共25页)
- 西门子顺序功能图语言S7-Graph的应用
- 中医治疗室工作制度管理办法
- 提花装造工艺技术培训课程
- 食堂投诉处理方案
- 北京市昌平区2021-2022学年八年级上学期期末考试语文试卷(word版含答案)
- 直播传媒公司简介PPT课件(参考)
评论
0/150
提交评论