《程序设计法学(三).ppt》由会员分享,可在线阅读,更多相关《程序设计法学(三).ppt(120页珍藏版)》请在三一办公上搜索。
1、2023/9/13,华东师大计算机科学技术系,1,第三章 程序的数据结构,数据结构是程序设计不可分割的部分。算法数据结构程序(N.Wirth)数据及对数据的处理程序设计的核心。数据表示的复杂程度直接决定了其上操作的复杂性,如不能有效地控制数据表示,必将导致软件系统的失败。不同的应用领域对所要求的数据结构可能不同。不同的数据结构直接决定了同一算法的不同实现。,2023/9/13,华东师大计算机科学技术系,2,3.1 类型,类型某些具有相同(相似)特性事物的集合类型系统多种类型按某种方案加以组织以了解其复杂的关系,这是对科学发展起了重要作用的方法分类法。程序设计语言中,类型是一种最基本的概念,也是
2、构造程序的基础。数据类型:1)一个值的集(类型域)2)一个作用于值集的操作集,2023/9/13,华东师大计算机科学技术系,3,1.对类型的描述,1)确定值的集 如:布尔类型 Boolean:true,false 字符串 a)空串是字符串 b)单个字母是字符串 c)串的并置是字符串 2)描述操作集 语法说明:指出操作名、被操作的数据类型 语义说明:操作的意义,2023/9/13,华东师大计算机科学技术系,4,描述方法:a)自然语言(非形式化方法)模糊 b)形式化方法精确 例如,加法(整数集上)可描述为:a)a,b是整数,则a+b是整数 b)+:intintint 例1 字符串类型定义(操作集)
3、Horowitz,2023/9/13,华东师大计算机科学技术系,5,type String declare NULLString/*语法说明*/ISNULL(String)Boolean LEN(String)Int ADDCHAR(String,Char)String CONCAT(String,String)String SUBSTR(String,Int,Int)String INDEX(String,String)Int for all s,tString,c,dChar,i,jInt let ISNULL(NULL)=true ISNULL(ADDCHAR(s,c)=false,20
4、23/9/13,华东师大计算机科学技术系,6,LEN(NULL)=0 LEN(ADDCHAR(s,c)=LEN(s)+1 CONCAT(s,NULL)=s CONCAT(s,ADDCHAR(t,d)=ADDCHAR(CONCAT(s,t),d)SUBSTR(NULL,i,j)=NULL SUBSTR(ADDCHAR(s,c),i,j)=if j=0 then NULL else if j=LEN(s)-i+2 then ADDCHAR(SUBSTR(s,I,j-1),c)else SUBSTR(s,i,j),2023/9/13,华东师大计算机科学技术系,7,INDEX(s,NULL)=LEN(
5、s)+1 INDEX(NULL,ADDCHAR(t,d)=0 INDEX(ADDCHAR(s,t),ADDCHAR(t,d)=if INDEX(s,ADDCHAR(t,d)0 then INDEX(s,ADDCHAR(t,d)else if c=d and t=SUBSTR(s,LEN(s)-LEN(t)+1,LEN(t)then LEN(s)-LEN(t)+1 else 0 end end String,2023/9/13,华东师大计算机科学技术系,8,2对类型的处理,)提供一个数据类型集;嵌入语言的类型)提供一种机制,允许定义一种新的类型)变量的值限制于某种类型加以说明或定义)提供一种类型
6、检验的机制a)静态类型化语言。每个表达式的类型在 静态程序分析时确定b)强类型化语言。每个表达式类型是一致的c)弱类型化语言。,2023/9/13,华东师大计算机科学技术系,9,3类型化语言的优点,a)有助于正确性的加强(对系统的某种限制)。b)增加了程序的可读性、可靠性、可维护性(防止基本逻辑单元间的不一致性)。c)为程序设计者提供了在现实世界和程序所操纵的数据对象之间的连接渠道。d)可以帮助发现错误(通过类型的唯一性)。,2023/9/13,华东师大计算机科学技术系,10,3.2 程序设计语言中的类型,发展过程:无类型、机器指令、汇编指令(抽象)基本数据类型(不够)结构化类型(大型程序设计
7、)抽象数据类型(对象化)类、继承 1.可枚举类型。由有限的值集构成,所有的值组成一个表或通过上下界来限定,每个值称为一个文字量 操作:相等()、赋值(:=)、前者(pred(x))、后继(succ(x))、枚举、子界、集合(set)如:Pascal语言中有枚举、子界类型,2023/9/13,华东师大计算机科学技术系,11,2 基本数据类型 布尔型、字符型、数值型、void型(值集为空)3 结构化类型)数组:是变量的有序的集合 type T:arrayI of T0 索引类型I:选择数组元素的值类型 元素类型T0:数组元素类型,典型的是数类型,可 不加限制 元素均相同,称为同类数组;否则称为异类
8、数组 数组的规模与表示这个数组所需的存贮容量有关 存储分配:编译时进行 C PASCAL FORTRAN 运行时进行 PL/I,2023/9/13,华东师大计算机科学技术系,12,操作:选择元素操作(下标)整体复制 a:=b 部分复制 a*,3)记录:多个值的集合分量称为域,不同域可以有不同的类型说明指出了类型的构造type T=Record S1:T1,Sn:Tn end操作:选择元素 同一记录每个域的标识必须不同,不同的记录域的标识任意,2023/9/13,华东师大计算机科学技术系,13,)序列(字符串)序列是一个数组,串是一个字符序列,也可以作为独立的类型,长度可变。操作:如:PL/1中
9、定义了六种|连接 INDEX(a,b)b在a中第一次出现的位置 LENGTH 长度 SUBSTR 子串 TRANLATE(a,b,c)a中的c用b替代 VERIFY(a,b)a中第一个在b中不出现的字符,否则为0,2023/9/13,华东师大计算机科学技术系,14,)指针type T=T0 T0为所指对象的类型指针最早在PL/1中出现,无类型检查,ALGOL68首次引入类型化指针。能力很强:允许存储的生命期超出程序块的边界。允许若干变量共享存储。允许复杂结构有选择地被更新。极易出错:如“悬摆指针”较难理解:如 int*(*(*x)6)();char(*(*y()();,2023/9/13,华东
10、师大计算机科学技术系,15,操作:相等(不等)、赋值、引用、存储分配(new)(释放 free)联合(变体记录)递归类型:一个递归类型是涉及自身的类型 如:type tree=record left,right:tree;info:int;end record;root:tree;无法解决直接存储问题,通常的方法是引入指针。,2023/9/13,华东师大计算机科学技术系,16,3.3 数据抽象,抽象:是普遍的概念,是普遍的、科学的方法。是对一种事物(或一个系统)的简化描述。把注意力集中在本质方面,而忽略其细节。E.Dijstra:设计实现一个大规模软件的中心问题是怎样减少复杂度。一个途径就是抽
11、象。软件技术的发展过程就是抽象程度不断提高的过程。,2023/9/13,华东师大计算机科学技术系,17,1.数据抽象,“子程序”是一种沿用很久的一种抽象。但存在:如何对共享变量(全局量)进行检验的问题。仅有结构化程序设计一个方法不能应付日益增大的软件规模。需要一种新的途径去组织并保护数据。1)数据类型的定义不仅只是值的集合,还应包含作用于值集的操作集。2)对数据的保护不能只依靠程序员或OS,语言本身应提供保护的机制。3)应支持分块编译。,2023/9/13,华东师大计算机科学技术系,18,概念,于是产生数据抽象这一概念:把数据类型的定义与其实现加以分离。a)把大系统分解成多个小部分,每部分有为
12、所处理数据而设计的接口。b)接口是这个部分的说明,是外部可见的而该部分的实现是隐藏的,外部不可见的。c)所需的保护措施放在每个接口中。,2023/9/13,华东师大计算机科学技术系,19,意义,数据抽象是继结构化程序设计后又一次革命。降低了程序设计的复杂性,为程序正确性验证提供了一个框架,为提高软件生产率提供了一种手段。以后出现的新的程序设计语言都建立在数据抽象的基础上。,2023/9/13,华东师大计算机科学技术系,20,2抽象数据类型(ADT),根据数据抽象的原则,符合“一个值集和作用在值集上的操作集”的数据类型,称为ADT.一个ADT可以分解成四部分:语法说明 语义ADT 表示实现 算法
13、,使用ADT不需要知道如何实现,有关实现的知识不能被直接使用!,2023/9/13,华东师大计算机科学技术系,21,语法:指出所有操作符或过程名,被操作对象 的个数及类型、返回类型语义:说明类型的行为、意义(可以用形式的 或非形式的方法表示)表示:指出ADT中值的存储形式(数据结构)算法:说明是如何实现的,2023/9/13,华东师大计算机科学技术系,22,例:用ADT定义字符串charstring,说明 语法:元素:AZ,结构:元素间的先后线性关系 域:串长为060 语义:操作 用前置条件(pre)、后置条件(post)说明操作的行为。操作前的值,记为s_pre 操作后的值,记为s_post
14、,2023/9/13,华东师大计算机科学技术系,23,leftchar(var s:charstring):char pre:字符个数0 post:leftchar是输入串s中最左边的字符,s_post是s_pre除去左边第一个字符后的字符串。append(c:char;var s:charstring)pre:s_pre中的字符数小于60 post:s_post的长度比s_pre的长度大1 s_post的最后一个字符是cempty(s:charstring):Boolean pre:无 post:如s空,返回true;否则false.,2023/9/13,华东师大计算机科学技术系,24,fu
15、ll(s:charstring)pre:无 post:如s包含60字符,返回true;否则false.reverse(var s:charstring)pre:无 post:倒转;第一个字符与最后一个字符互换 第二个字符与最后第二个字符互换 以此类推。,2023/9/13,华东师大计算机科学技术系,25,实现:表示:type charstring record n:0.60;str:array1.60 of char;end算法:略试用形式的方法表示各操作的pre和post,2023/9/13,华东师大计算机科学技术系,26,ADT的优点,1)支持模块化:ADT自成模块,使结构化得以保证,程序
16、易理解。2)封装性:“黑匣”,数据结构的完整性得以保证。3)简化对正确性的验证:可单独对ADT进行验证,ADT又是类型化的,可由编译加以检验。4)实现部分可独立更换不影响使用,支持复用,提高软件质量。,2023/9/13,华东师大计算机科学技术系,27,3.支持数据抽象的语言及其设施,最早支持ADT 是simula 67,其ADT的设施是CLASS,在ALGOL语言的基础上发展起来的。Modula是Pascal的直接后继者,流行的是 modula-2,ADT的设施是module。由定义部、实现部所组成。a)分别编译、存放在库中,主程序在执行中能自动调用module。b)定义部:外部可见;实现部
17、:对外隐蔽的。,2023/9/13,华东师大计算机科学技术系,28,例:Buffer的modula-2实现,DEFINITION MODULE BufferEXPORT QUALIFIED put,get,nonempty,nonfull;VAR nonempty,nonfull:Boolean;Procedure Put(x:CARD);Procedure Get(x:CARD);END BufferIMPLEMENTATION MODULE Buffer;CONST N=100;,2023/9/13,华东师大计算机科学技术系,29,VARProcedure Put(x:CARD)Begin
18、endProcedure get(x:CARD)BeginendBegin(初始化)end,2023/9/13,华东师大计算机科学技术系,30,Ada是数据抽象的概念趋于成熟时的产物。Ada支持ADT的设施是:Package(串行)task(并行)Package的二种形式:a)由说明部和实现部组成b)在说明部后加上private部,2023/9/13,华东师大计算机科学技术系,31,例:Stack的Ada实现,package STACK is procedure PUSH(x:REAL);function POP return REAL;end;package body STACK is MA
19、X:constant:=100 S:array(1.MAX)of REAL;PTR:INTEGER range 0.MAX,2023/9/13,华东师大计算机科学技术系,32,procedure PUSH(x:REAL)is begin end PUSH;function POP return REAL begin end POP;begin PTR:=0;end STACK;,2023/9/13,华东师大计算机科学技术系,33,实现部中有关类型的说明可在说明部分中用private指出,如:package STACK is private type STACK is record MAX:co
20、nstant:=100;S:array(1.MAX)of REAL;PTR:INTEGER range 0.MAX:=0;end record;end;,2023/9/13,华东师大计算机科学技术系,34,外部程序使用Package的三种形式:a)package名加操作名,用.隔开,如:STACK.PUSH(X)b)用一个子句,如:declare use STACK begin PUSH(X);end;c)再命名方法:declareProcedure SPUSH(X:REAL)renames STACK_PUSH(X);begin SPUSH(X);end;,2023/9/13,华东师大计算机
21、科学技术系,35,4.支持数据抽象其他设施,a)类属函数(Generic)问题:能否对同一类操作设计一个模板式的通用程序,可用于不同的数据类型。解决:类属函数(过程),作为通用的模板,将一个或多个元素参数化,编译时被实例化,得到确定数据类型的函数(过程)。特点:不能直接使用,必须实例化。以类属说明定义,通过类属形实替换完成。,2023/9/13,华东师大计算机科学技术系,36,例:Ada支持类属函数的方法,以STACK为例:generic MAX:INTEGER;type ELEM is private;package STACK is procedure PUSH(x:ELEM);funct
22、ion POP return ELEM;end;end STACK;,2023/9/13,华东师大计算机科学技术系,37,b)多态(polymorphism)单态:若一个类型化的语言每个值有且只有一种类型,称为单态语言。多态:若一个类型化的语言每个值可以有多于一种的类型,称为多态语言。参数的 通用 包含的多态 过载的 特定 强制的,通用:对工作的类型数量不限,允许不同类型的变 元执行相同的代码。特定:对工作的类型数量限 制,不同类型的变元 可能需要执行不同的 代码。,2023/9/13,华东师大计算机科学技术系,38,参数多态:应用较广,被称为最纯的多态,如类属函数。包含多态:如子类型化、继承
23、。过载多态:通过相同的语法对不同语义的对象使用相同的名。如重载。强制多态:通过语义操作改变一个变元的类型,以符合特定的要求。如强制类型转换(cast)。,2023/9/13,华东师大计算机科学技术系,39,c)分别编译(Separate Compilation)独立编译:FORTRAN整体编译:PASCAL分别编译:Ada ADT概念的形成和广泛应用和分别编译的思想及其应用密切相关。分别编译支持:程序库,使的ADT构成的模块可以存放在程序库中,不必使用时再编程。被编译的程序与库中已编译的模块相链接。,2023/9/13,华东师大计算机科学技术系,40,联编(binding)概念:联编是指一个名
24、(标识符)和存储地址相连。如:不同的语言何时进行联编的安排是不同的。如:FORTRAN 编译时 Pascal 过程入口处 C 分程序入口处联编与变量的作用域、生存期紧密相关。形实参数的联编参数与使用规则相关。静态联编(early):编译或链接时进行。动态联编(late):运行时进行,O-O语言必须支持。,2023/9/13,华东师大计算机科学技术系,41,3.4 面向对象方法,一、概述结构化、模块化、数据抽象提出一条正确的途径,但未能完全解决问题。面向对象方法起源于信息隐藏、抽象数据类型。基本思想:将要构造的软件系统表示为对象集,每个对象是一组数据及其作用在其上的一组基本操作封装而成的实体,对
25、象间通过消息传递实现联系。对象软件观(Object Paradigm)软件开发的主流思想,2023/9/13,华东师大计算机科学技术系,42,2023/9/13,华东师大计算机科学技术系,43,新观念引入了新的思想、方法、技术。基本特征:以对象为软件的构件以类来叙述对象的行为以消息来引发对象的行为基本概念对象和类继承性封装性多态性例:略,2023/9/13,华东师大计算机科学技术系,44,二、应用框架,概念应用框架(Application FrameWork):在特定应用领域中,程序间的共同结构。使该领域的中的程序员可以按照共同结构来开发程序。框架:a)整个或部分系统的可复用设计,表现为一组抽
26、象构件及构件实例间的交互方法;b)是可被应用开发者定制的应用骨架。框架是一个可以被复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件间的依赖关系、责任分配和控制流程,表现为一组抽象类及其实例间的协作方法,为构件复用提供了上下文。,2023/9/13,华东师大计算机科学技术系,45,实现:通用的类、对象、函数及其它们间的稳定关系。例如:长方形a、b的抽象c称图形c为抽象图,a、b为具体图,可以从抽象图派生出具体图。抽象:从相似的事物中抽离出其共同点,得到抽象框架。派生:以抽象框架为基础,添加功能成为具体事物。抽象:将同领域的程序中具有共同点的类的共同结构抽离,称为抽象类,加上类间关
27、系,形成应用框架。派生:基于框架的抽象类,增添特定功能,形成具体类,再创建对象。,图a,图b,图c,2023/9/13,华东师大计算机科学技术系,46,注:目前的框架通常已包含了类库功能,即不仅含有抽象类,也提供具体类。,2023/9/13,华东师大计算机科学技术系,47,实例Smalltalk-80 的MVC框架MVC(Model、View、Controller)使Smalltalk程序员快速地建立程序的用户接口。其包含model、view及controller抽象元素。其中:model对象负责管理数据或文件,可以对应多个view对象,每个view对象显示model对象的某一方面,有一个对应
28、的controller对象,其负责处理用户的输入。工作过程:用户输入消息,controller处理发消息要求model处理文件、数据,要求view更新画面。一旦model对象中的数据更新后会通知各controller和view对象,各view对象从model取得新数据,更新画面。,2023/9/13,华东师大计算机科学技术系,48,MVC框架对象关系图,输入,Model,消息,消息,显示,Controller,View,消息,应用程序或数据,2023/9/13,华东师大计算机科学技术系,49,MacApp框架Apple公司的 MacApp框架协助开发Macintosh上的应用程序,应用程序含有
29、三个部分:application:启动程序、解释用户的消息和命令。document:管理与储存应用程序的文件数据。view:显示与输出文件数据,有多个。框架产生的接口含有多个对象:application对象:启动程序、创建document对象,显示窗口选择表,传递消息和命令等。document对象:创建有关的view、window、framed等对象。当数据变化时通知view,更新窗口内容。window对象负责出口的移动、开、关,通知frame对象协助改变窗口大小与卷动等。,2023/9/13,华东师大计算机科学技术系,50,frame对象:负责将窗口分割为小区域(每个区域可对应一个view)
30、、卷动及改变窗口大小。view对象:显示数据、记录滑动的的位置、改变光标的形状。command对象:对用户使用鼠标、选择表及键盘发出的命令,转发给document或view对象,由它们进一步处理。MacApp框架对其后的应用框架MFC、OWL、TAE(Taligent)产生了很大的影响。,2023/9/13,华东师大计算机科学技术系,51,3.设计技术,抽象类抽象类是应用框架的主角,是O-O的重要概念。设计方法:观察几个相似的类分辨它们的异同点抽离它们的相同点,得到的父类即为抽象类实现如果在类中,某些函数(方法)不完整(内容缺省),就称为抽象类。反之,类中的函数是完整的称为具体类。,2023/
31、9/13,华东师大计算机科学技术系,52,以C+为例:class Personpublic:virtual void Display()=0;抽象类的目的:提供给具体类继承,不用来创建对象具体类的目的:创建对象关于抽象类,一般语言(如C+)要求:抽象类不能成为自变量的类型。(如Person P)抽象类不能成为函数的类型。(如Person Sub()抽象类不能用来转换对象的类型。,2023/9/13,华东师大计算机科学技术系,53,可以使用抽象类指针来指向子类的对象(Person*P=&cust)指针可以成为函数的自变量(Person*P)函数可以回传抽象类的指针(Person*Sub())能声
32、明抽象类的引用。这包括:声明抽象类的引用抽象类的引用可以作为函数的自变量函数可以传回抽象类的引用值双向通信传统的链接库及类库只提供单向通信(正向通信),应用程序调用库中函数(晚辈调用前辈)。,2023/9/13,华东师大计算机科学技术系,54,应用框架除提供正向调用外,还提供了反向调用,即应用框架中的函数也能调用程序中的函数(前辈调用晚辈)。例1:双向通信/ex0301.h:#include#include class Person protected:char name20;public:void SetName(char*na)strcpy(name,na);virtual void Di
33、splay()=0;,2023/9/13,华东师大计算机科学技术系,55,class Company:public Person public:virtual void Display()cout Display();virtual void Print()=0;,2023/9/13,华东师大计算机科学技术系,56,示意图:,Product,Person,Customer,TV,VIP,框架中,应用程序中,2023/9/13,华东师大计算机科学技术系,57,应用程序为:#include“ex0301.h”/class Person,Customer,2023/9/13,华东师大计算机科学技术系
34、,58,class TV:public Product double price;public:TV(int no,double pr):Product(no)price=pr;virtual void Print()cout“TV No:”proednl;cout“Price:”priceednl;,2023/9/13,华东师大计算机科学技术系,59,void main()TV t(1100,1800.5);VIP vp(“Peter”,“666-8899”);t.Soldto(vp);t.iIquire();运行结果:TV No:1100Price:1800.5Sold toCustome
35、r:PeterTEL:666-8899,2023/9/13,华东师大计算机科学技术系,60,应用框架中的几个特性:程序执行时,主控权在框架。尽管main()函数仍是程序的启动者,但主要的处理过程在Product类中。如:SoldTo()处理商品与顾客的关系;Inquire()调用TV的Print()输出商品数据,调用VIP的Display()输出顾客的数据。程序中的类,其成员函数主要供框架调用。如:TV的Print()供Inquire()调用;VIP的Display()供Inquire()调用。由于框架掌握主控权,复杂的指令在框架中,将极大地简化应用程序。因此,一个优秀的框架让程序员如虎添翼。
36、,2023/9/13,华东师大计算机科学技术系,61,框架中的Inquire()反向调用子类的Print()函数。这是同体系内的反向调用。框架中的Inquire()反向调用VIP的Display()函数。这是不同体系内(跨体系)的反向调用。注意这两种反向调用必须借助于虚拟函数。预设函数预设函数是按领域惯例而设定的处理函数。领域惯例是自动化、软件设计的基本概念。惯例提高了生产力惯例是可以修正的(以自动驾驶、收费为例)应用框架支持预设函数。其机制为:,2023/9/13,华东师大计算机科学技术系,62,框架支持事先定义足够多的预设函数;程序员的工作是设计函数供框架来调用,这些函数可以修正或取代框架
37、中的函数;如果程序中的函数已经修正或取代了预设函数,框架调用程序中的函数,反之调用预设函数。这满足事件驱动(Event-Driven)。以在Windows支持下的预设函数和反向调用在框架中的工作原理为例:,2023/9/13,华东师大计算机科学技术系,63,使用者,Windows,应用框架,应用程序,预设f1(),预设f3(),预设f4(),f1(),f2(),f4(),f2()=0,事件1,事件3,事件2,消息,消息,消息,消息,消息,消息,消息,2023/9/13,华东师大计算机科学技术系,64,工作过程,框架中预设了f1(),程序中定义了f1(),此时优先调用程序中的f1()。框架中虚设
38、了f2(),即f2()是个纯虚函数。因此,必须定义f2()来具体化,可让Windows或其他函数调用,如:f3()调用了f2()。框架中预设了f3(),程序没有定义f3(),此时调用预设的f3()函数。框架中预设了f4(),程序中也定义了f4(),此时优先调用程序中的f4(),而程序中的f4()可以调用预设的框架中的f4()函数。,2023/9/13,华东师大计算机科学技术系,65,三、设计模式(Design Pattern),上世纪九十年代起,模式的观念和理论逐渐成为O-O领域中的热点。什么是模式?模式是人们遇到特定问题时惯用的解决(应付)的方法,此方法应是有效的、可靠的。模式理论大师Chr
39、istopher Alexander认为(定义):模式是某外在环境(Context)下,对特定问题(Problem)的惯用解决方案(Solution)。软件复用的三个级别:a)内部复用,指的是同一应用中能公共使用的抽象块。b)代码复用,指的是将通用模块组合成库或工具集,供多个应用领域的应用程序使用。c)框架复用,指的是为特定领域提供通用的基础架构,可获得更高级别发复用。,2023/9/13,华东师大计算机科学技术系,66,设计模式与框架:设计模式是一种设计复用,框架是一种部分代码复用部分设计复用。设计模式比框架更为抽象;可以成为框架中的一个元素;框架是针对某一特定应用领域,但同一模式可以设用多
40、个应用。框架是软件,设计模式是软件的知识。设计模式的四要素:模式名:一个助记符,用一两个词来描述模式的问题、解决方案和效果。问题:描述了何种情况下可以使用该模式、使用该模式的前置条件、解释了设计问题和问题的前因后果。,2023/9/13,华东师大计算机科学技术系,67,解决方案:描述了设计的组成成分、相互关系、职责和协作方式。由于模式就像一个模板,可应用于各种不同的场合,因此解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和如何用一个具有一般意义的元素组合(类或对象)来解决问题。效果:描述了应用的效果和使用模式应权衡的问题。通常包括:时间/空间的权衡、语言和实现,系统的灵
41、活性、可扩充性和可移植性等。MVC模式(Model View Controller)Model,表达应用领域有关的类、对象、数据结构以及企业的业务逻辑等;,2023/9/13,华东师大计算机科学技术系,68,View,代表窗口画面,负责将Model的实现呈现给用户;Controller,监控用户传来的消息,并根据消息指挥、协调Model与View的合作。在OOD中可以定义类来表达:,model,0*,0*,2023/9/13,华东师大计算机科学技术系,69,这3类对象负责不同的任务:,controller,view,model,显示,更新,用户信息,标志,改变,2023/9/13,华东师大计算
42、机科学技术系,70,Erich Gamma等提出的设计模式,Erich Gamma等人提出了23种设计模式,将模式分为创建型、结构型和行为型。创建型模式Abstract Factory(抽象工厂):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。Builder(生成器):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。,2023/9/13,华东师大计算机科学技术系,71,Factory Method(工厂方法):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。它将使一个类的实例化延迟到其子类。Prototype(原型):用原型实例指定创建对
43、象的种类,并且通过复制该原型来创建新的对象。Singleton(单件):保证一个类只有一个实例,并提供一个访问它的全局访问点。,2023/9/13,华东师大计算机科学技术系,72,讨论:创建型模式抽象了实例化的过程,从而帮助系统独立于对象的如何创建、组成和表现。在系统演化成更依赖于对象组合而非类继承时,创建型设计模式的重要性就体现出来。此时,重点从定义具体的行为转到定义能组合成复杂行为的基本行为单元。该模式中不断出现的主题是:封装了系统所使用的具体类的信息;隐藏了如何创建和组成这些具体类的实例。应用:略:,2023/9/13,华东师大计算机科学技术系,73,结构型模式Adapter(适配器):
44、将一个类的接口转换成用户希望的另一个接口。该模式使原来由于接口不兼容而不能一起工作的那些类可以一起工作。Bridge(桥接):将抽象部分与它的实现部分分离,使它们都可以独立地变化。Composite(组成):将对象组合成树形结构以表示“部分整体”的层次结构。它将使用户对单个对象和复合对象的使用具有一致性。,2023/9/13,华东师大计算机科学技术系,74,Decorator(装饰):动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类的方式更加灵活。Facade(外观):为子系统中的一组接口提供了一个一致的界面。该模式定义了一个高层接口,该接口使这子系统更加容易使用。Flywei
45、ght(享元):运用共享技术有限地支持大量细粒度的对象。Proxy(代理):为其他对象提供一个代理以控制对这个对象的访问。,2023/9/13,华东师大计算机科学技术系,75,讨论:结构性设计模式关注于如何将类和对象组合成更大的结构。使用继承来组合接口或实现。该类模式在使相互独立的类库一同工作上非常有效。该类模式还提供了通过组合对象来实现新功能的方法。这来自于运行时改变组合的能力。应用略,2023/9/13,华东师大计算机科学技术系,76,行为模式Chain of Responsibility(职责链):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链
46、,并沿着这条链传递该请求,直到有一个对象处理它。Command(命令):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化。对请求排队或记录请求日志以及支持可取消的操作。Interpreter(解释器):给定一个语言,定义它的文法的一种表示,并定义一个解释器,其使用该表示来解释语言中的句子。,2023/9/13,华东师大计算机科学技术系,77,Iterator(迭代器):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。Mediator(中介者):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之
47、间的交互。Memento(备忘录):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后就可以将该对象恢复到所保存的状态。,2023/9/13,华东师大计算机科学技术系,78,Observer(观察者):定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都将得到通知并自动更新。State(状态):允许一个对象在其内部状态改变时改变它的行为。这样,对象似乎修改了它所属的类。Strategy(策略):定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。使得算法的变化可以独立于使用它们的用户。,2023/9/13,华东师大计算机科学技
48、术系,79,Template Method(模板方法):定义一个操作中的算法的骨架,并将一些步骤延迟到子类中。这样使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。Visitor(访问者):表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新操作。讨论:应用:略,2023/9/13,华东师大计算机科学技术系,80,3.5 面向方面程序设计,面向方面程序设计(Aspect-Oriented Programming),简称AOP,是一种新的程序设计技术,是对目前主流的程序设计技术面向对象技术的重要的扩展。它将影响多个类的行为封装到一个可重用
49、模块,即Aspect中,从而解决了传统程序设计方法所带来的代码混乱和分散问题,为进一步增强了代码的重用性和灵活性提供了可能的途径。,2023/9/13,华东师大计算机科学技术系,81,一、概述,AOP的核心思想是将软件系统中的横切关注点和核心关注点分别模块化,其中横切关注点通过方面(aspect)实现模块化,核心关注点通过类(class)实现模块化,再通过一个类似于编译器的工具方面编织器(aspect weaver)对已模块化的两类关注点进行编译,从而构造出新的系统。,2023/9/13,华东师大计算机科学技术系,82,AOP产生背景和现状,AOP的概念是由 1997年,施乐公司帕洛阿尔托研究
50、中心(Xerox Palo Alto Research Center)的Gregor Kiczales等人在欧洲面向对象程序设计大会(ECOOP)上,第一次提出的。目前全球已开展大量有关AOP的研究与开发工作。自2002 年起,每年组织召开AOSD(面向方面软件开发)国际学术会议。其它的研究机构或组织包括ECOOP AAOS WorkShop以及ICSE的AOP WorkShop等等。除了施乐公司外,微软、IBM、西门子以及东芝等公司都积极参与面向方面编程的研究,欧美和日本的不少大学也在进行这方面的研究。,2023/9/13,华东师大计算机科学技术系,83,面向对象方法的问题,在面向对象方法中