chapter01_基础知识

上传人:gb****c 文档编号:243016197 上传时间:2024-09-13 格式:PPT 页数:45 大小:90.50KB
返回 下载 相关 举报
chapter01_基础知识_第1页
第1页 / 共45页
chapter01_基础知识_第2页
第2页 / 共45页
chapter01_基础知识_第3页
第3页 / 共45页
点击查看更多>>
资源描述
Body Text,Second Level,Third Level,Fourth Level,Fifth Level,Click to edit Master title style,面向对象分析与设计,Object Oriented Analysis and Design,软件工程系,Email:,Tel:,主要内容,OOA&D基础知识,GRASP模式、OO原则和GoF设计模式,UML建模工具 Rational Rose 2003,OOA&D基础知识,OO基本概念及特点,UML和类图关系,OO原则与模式,OO基本概念,首先根据客户需求抽象出业务对象;然后对需求进行合理分层,构建相对独立的业务模块;之后设计业务逻辑,利用多态、继承、封装、抽象的编程思想,实现业务需求;最后通过整合各模块,达到高内聚、低耦合的效果,从而满足客户要求。,面向对象的分析根据抽象关键的问题域来分解系统。面向对象的设计是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成“现实世界”的对象。,OO术语,对象:对象是运行期的基本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体。,类:类是具有相同类型的对象的抽象。一个对象所包含的所有数据和代码可以通过类来构造。,封装:封装是将数据和代码捆绑到一起,避免了外界的干扰和不确定性。对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。,继承:继承是让某个类型的对象获得另一个类型的对象的特征。通过继承可以实现代码的重用:从已存在的类派生出的一个新类将自动具有原来那个类的特性,同时,它还可以拥有自己的新特性。,多态:多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。,动态绑定:绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式。,消息传递:对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。,方法:方法(Method)是定义一个类可以做的,但不一定会去做的事。,OO特点,封装,继承,多态,类的复用,封装,类(class),接口(interface),包(package),类图(UML),UML 类图,UML 接口,UML 包,继承,类的继承(extends),接口的继承(extends),接口的实现(implements),多态,把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。,方法多态,方法重载(overloading),方法覆盖(overriding),对象变量多态(李氏替换原则)。,泛型多态(genericity )。,实现运行时多态技术的条件:,有一个继承层次关系;,在子类中重写基类的方法;,通过基类的引用对子类对象进行调用。,类的复用,继承,优点:,容易进行新的实现,因为其大多数可继承而来。,易于修改或扩展那些被复用的实现。,缺点:,破坏了封装性,因为这会将父类的实现细节暴露给子类。,“白盒”复用,因为父类的内部细节对于子类而言通常是可见的。,当父类的实现更改时,子类也不得不会随之更改。,从父类继承来的实现将不能在运行期间进行改变。,组合也就是一个类的对象是另外一个类的成员,class Head,Head()System.out.println( head );,class Body,Body()System.out.println( body );,class Person(),Head h=null;,Body b=null;,Person() ,h=new Head();,b =new Body();,优点:,容器类仅能通过被包含对象的接口来对其进行访问。,“黑盒”复用,因为被包含对象的内部细节对外是不可见。,封装性好。,实现上的相互依赖性比较小。,每一个类只专注于一项任务。,通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。,缺点:,从而导致系统中的对象过多。,为了能将多个不同的对象作为组合块来使用,必须仔细地 对接口进行定义,UML和类图关系,实现关系(Realization),泛化关系(Generalization),关联关系(Association),聚合关系(Aggregation),合成关系(Composition),依赖关系(Dependency),泛化关系(Generalization),泛化表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。在Java中,用,extends,关键字来直接表示这种关系。,实现关系(Realization),实例关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。对Java应用程序进行建模时,实现关系可直接用,implements,关键字来表示。,关联关系(Association),关联关系表明对象是相互连接的。箭头是可选的,它用于指定导航能力。如果没有箭头,暗示是一种双向的导航能力。,聚合关系(Aggregation),聚合是关联的一种形式,代表两个类之间的整体/局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。聚合也转换成Java中的一个实例作用域变量。,合成关系(Composition),合成 是聚合的一种特殊形式,暗示“局部”在“整体”内部的生存期职责。合成也是非共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。但是,整体可将所有权转交给另一个对 象,后者随即将承担生存期职责。,依赖关系(Dependency),发生变化后,可能影响依赖于它的其他实例。更具体地说,它可转换为对不在实例作用域内的一个类或对象的任何类型的引用。其中包括一个局部变量,对通过方法调用而获得的一个对象的引用或者对一个类 的静态方法的引用。,OO原则与模式,OO原则,GRASP模式,GoF设计模式,建筑设计模式,软件设计模式,OO原则,(1)“开-闭”原则(Open-Closed Principle,OCP),(2)里氏代换原则,(Liskov Substitution Principle, 或者LSP),(3)依赖倒转原则,(Dependency Inversion Principle, 或者DIP),(4)接口隔离原则,(Interface Segregation Principle, 或者ISP),(5)组合/聚合复用原则,(Composition/Aggregation Principle, 或者CARP),(6),迪米特法则或最少知识原则,(,Law of Demeter or Least Knowlegde Principle,LoD or LKP,),(7)单一职责原则 (Single Responsibility Principle ,SRP ),(1)“开-闭”原则 (Open-Closed Principle,OCP),Software entities should be open for extension,but closed for modification 。,简单的来说开闭原则就是对系统的修改关闭,系统的扩展开放,做到有的放矢。在设计一个模块的时候,应当使这个模块在不被修改的前提下被扩展。换言之,应当可以在不必修改源代码的情况下改变这个模块的行为。GOF的23种设计模式基本都支持OCP,说明OCP的重要性,可以说开闭原则是设计系统的总则 。,例子:玉帝招安美猴王,当年大闹天宫便是美猴王对玉帝的新挑战。美猴王说:皇帝轮流做,明年到我家。只教他搬出去,将天宫让于我!对于这项挑战,太白金星给玉皇大帝提出的建议是:降一道招安圣旨,宣上界来,一则不劳师动众,二则收仙有道也。,换而言之,不劳师动众、不破坏天规便是闭,收仙有道便是开。招安之道便是玉帝天庭的开放封闭原则。,招安之法的关键便是不允许更改现有的天庭秩序,但允许将妖猴纳入现有秩序中,从而扩展了这一秩序。用面向对象的语言来讲,不允许更改的是系统的抽象层,而允许更改的是系统的实现层。,(2)里氏代换原则 (Liskov Substitution Principle, 或者LSP),很严格的原则,规则是“子类必须能够替换基类,否则不应当设计为其子类。”,也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类。,LSP是继承复用的基石。只有当子类可以替换掉基类,软件单位的功能不会受到影响时,基类才能真正被复用,而子类也才能够在基类的基础上增加新的行为。,(3)依赖倒转原则 (dependence inversion principle, DIP),依赖倒转原则讲的是:要依赖于抽象,不要依赖于具体,就是说我们尽量在抽象层进行控制编程,要针对接口编程,不要针对实现编程。,(4)接口隔离原则(Interface Segregation Principle, 或者ISP),使用多个专门的接口比使用单一的总接口要好。也就是,从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的。,把几个看上去差不多的接口合并成一个接口,节省接口的数目,而形成一个臃肿的大接口,是对接口的污染。,(5)组合/聚合复用原则(Composition/Aggregation Principle, CARP) 也称为 合成复用原则,(,Composite Reuse Principle或CRP,),要尽量使用合成/聚合,尽量不要使用继承。合成(Composition)和聚合(Aggregation)均是关联(Association)的特殊种类。,聚合用来表示“has-a”关系或者整体与部分的关系,而合成则用来表示一种强的多得“has-a”关系。在一个合成关系里,部分和整体的生命周期是一样的。一个对象在同一个时间内只能属于一个合成关系,一个合成关系中的成分对象是不能与另一个合成关系共享的。这种复用是黑盒复用。继承复用通过扩展一个已有对象的实现来得到新的功能。继承复用破坏包装,因为继承将超类的实现细节暴露给子类。这种复用是白盒复用。如果超类的实现发生改变,那么子类的实现不得不发生改变的。继承是“Is-A”关系。合成/聚合是“Has-A”关系。,(6)迪米特法则或最少知识原则 (Law of Demeter or Least Knowlegde Principle,LoD or LKP),这个原则首次在Demeter系统中得到正式运用,所以定义为迪米特法则。它讲的是“一个对象应当尽可能少的去了解其他对象”。也就是又一个关于如何松耦合(Loosely-Coupled)的法则。,如果不是“朋友”,就不给予调用。,不和陌生人说话。,(7)单一职责原则(Single Responsibility Principle ,SRP ),单一职责很容易理解,也很容易实现。所谓单一职责,就是一个设计元素只做一件事。什么是“只做一件事”?简单说就是少管闲事。现实中就是如此,如果要你专心做一件事情,任何人都有信心可以做得很出色。,GRASP模式概述,设计模式是关于类和对象的一种高效、灵活的使用方式,也就是说,必须先有类和对象,才能有设计模式的用武之地,否则一切都是空谈,那么类和对象是从那冒出来的呢?这时就需要GRASP模式登场了!,GRASP(General Responsibility Assignment Software Patterns),中文名称为“通用职责分配软件模式”,GRASP一共包括9种模式,它们描述了对象设计和职责分配的基本原则。也就是说,如何把现实世界的业务功能抽象成对象,如何决定一个系统有多少对象,每个对象都包括什么职责,GRASP模式给出了最基本的指导原则。,GRASP模式通用责任分配软件模式,(1)专家模式(Expert),(2)创建者(Creator),(3)高聚合度或高内聚(High Cohesion),(4)低耦合度或低耦合(Low Coupling),(5)控制者(Controller),(6)多态(Polymorphism),(7)纯虚构 (Pure Farication ),(8)中介者(Indirection ),(9)保护变化(Protected Variations),(1)信息专家(Information expert),将职责分配给具有履行职责所需要的信息的类,通俗点就是:该干嘛干嘛去,别管别人的闲事或者我的职责就是搞这个,别的事不管。,举个简单的例子,如果有一个类是专门处理字符串相关的类,那么这个类只能有字符串处理相关的方法,而不要将日期处理的方法加进来。也就是提高软件高内聚一种原则。,(2)创建者(Creator),将创建一个类A的实例的职责指派给类B的实例,如果下列条件满足的话:,a) B聚合了A对象,b) B包含了A对象,c) B纪录了A对象的实例,d) B要经常使用A对象,e) 当A的实例被创建时,B具有要传递给A的初始化数据(也就是说B是创建A的实例这项任务的信息专家),f) B是A对象的创建者,如果以上条件中不止一条成立的话,那么最好让B聚集或包含A,通俗点就是:我要用你所以我来创建你,请不要让别人创建你,这个模式是支持低耦合度原则的一个体现,(3)高聚合度或高内聚(High Cohesion),分配一个职责的时候要保持类的高聚合度,聚合度或内聚度(cohesion)是一个类中的各个职责之间相关程度和集中程度的度量。一个具有高度相关职责的类并且这个类所能完成的工作量不是特别巨大,那么他就是具有高聚合度。,(4)低耦合度或低耦合(Low Coupling),在分配一个职责时要使保持低耦合度。,耦合度(coupling)是一个类与其它类关联、知道其他类的信息或者依赖其他类的强弱程度的度量。一个具有低(弱)耦合度的类不依赖于太多的其他类。,(5)控制者(Controller),将处理系统事件消息的职责分派给代表下列事物的类:,a) 代表整个“系统”的类,b) 代表整个企业或组织的类,c) 代表真实世界中参与职责的主动对象类(例,一个人的角色),d) 代表一个用况中所有事件的人工处理者类,通常用“处理者”的方式命名,这是一个控制者角色职责分配的原则,就是哪些控制应该分派给哪个角色。,(6)多态(Polymorphism),当相关的可选择的方法或行为随着类型变化时,将行为的职责-使用多态的操作-分配给那些行为变化的类型,也就是说尽量对抽象层编程,用多态的方法来判断具体应该使用那个类,而不是用if instanceof 来判断该类是什么接来执行什么。,提倡通过多态操作把基于类型的可变行为的定义职责分配给行为发生的类。所谓多态性,简单地说,就是具有同一接口的不同对象对相同的消息具有不同的行为。或者说同一消息作用于不同的对象,而产生不同的结果。,(7)纯虚构 (Pure Farication),提倡把那些非问题领域的职责分配给那些人工生成的或者容易此类职责的概念类(,Domain Class,)。,Domain Class:,设计对象的时候应该尽量保持与现实世界里的对象一致。这种与现实世界里的对象保持一致的从业务分析中抽象出来的类叫做“Domain Class”。,比如一个简单的用例:用户注册。用户就是一个“Domain Class”,它是现实世界里的业务对象。,用户注册需要操作数据库,数据库操作是系统功能实现的一个必需功能,它不是现实世界里存在的业务对象,它是一个非Domain Class。如果把数据库操作看作一个行为职责,它就相当于这里所说的“非问题领域里的职责”。一般来说,Domain Class与非Domain Class的功能如果聚集在一个类里,就破坏了“高内聚”原则。,(8)中介者(Indirection ),将职责分配给一个中间对象以便在其他构件或服务之间仲裁,这样这些构件或服务没有被直接耦合。这个中间对象(intermediary)在其他构件或服务间创建一个中介者(Indirection)。,当多个类之间存在复杂的消息交互(关联)时,Indirection模式提倡类之间不直接进行消息交互处理(非直接),而是导入第三方类,把责任(多个类之间的关联责任)分配给第三方类,降低类之间的耦合程度。,(9)保护变化(Protected Variations),提倡在可预测的变化或不安定因素的周围,用稳定的接口来承担职责。变化点:现有、当前系统或需求中的变化;演化点:预测将来可能会发生的变化点,但并不存在于现有需求中。在面向对象设计中,面向接口编程便符合Protected Variations模式的概念。,有人把Protected Variations模式称为Dont Talk to Strangers(别跟陌生人说话)。因为它跟实现Protected Variations模式的考虑方法一致。,Dont Talk to Strangers别名Demeter法则:(LoD: the Law of Demeter),它的基本原则是:只跟直接依赖的对象通信(不要耦合没有明显通信需求的2个对象),也就是说2个对象之间,能不关联的就尽量不要关联。,Gang oF Four (GoF),Erich Gamma、Richard Helm、Ralph Johnson and John Vlissides,Design Patterns: Elements of Reusable Object-Oriented Software(Addison-Wesley,1995)。,23种设计模式。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!