
Java面向对象程序设计杨晓燕第9章面向对象基本原则和模式ppt课件.ppt
31页第9章 面向对象根本原那么 和方式 Java面向对象技术 万事万物都被永久的真理支配并有规律的运转着方式也是一样,不万事万物都被永久的真理支配并有规律的运转着方式也是一样,不论那种方式,其背后都潜藏着一些论那种方式,其背后都潜藏着一些“永久的真理〞,这个真理就是设计原永久的真理〞,这个真理就是设计原那么设计原那么往往比设计方式更重要对于设计方式来说,为什么这那么设计原那么往往比设计方式更重要对于设计方式来说,为什么这个方式要这样处理这个问题,而另一个方式要那样,它们背后都遵照的就个方式要这样处理这个问题,而另一个方式要那样,它们背后都遵照的就是永久的设计原那么可以说,设计原那么是设计方式的灵魂是永久的设计原那么可以说,设计原那么是设计方式的灵魂 l UML类图类图 lUML〔Unified Modeling Language〕,即一致建模言语,是图标式软件设计言语l类图〔Class diagram〕是最常用的UML图,显示类、接口以及它们之间的静态构造和关系,用于描画系统的构造化设计类图最根本的元素是类或者接口 类的UML图lUML类图显示类的三个组成部分,第一是Java中定义的类名,第二个是该类的属性,第三个是该类提供的方法。
l第一层为类的称号,第二层是类的属性,第三层表示的是类的方法或称为操作 一个类图的类名是必需的 类的UML图l 留意:属性和方法之前附加的可见性修饰符, “+〞表示public,“-〞表示private,“#〞表示protected省略这些修饰符表示具有package〔包〕级别的可见性冒号后边表示数据的类型或方法的前往值类型l假设是笼统类,类名以斜体表示UML类图及关系接口的UML表示依赖关系:虚线+箭头 关联关系:空心的菱形+实线箭头 组合关系:实心的菱形+实线箭头 l实线+空心的三角形,起始端是子类,空心三角形指向终点端的父类l泛化关系:实现关系 l实现关系的UML表示法:虚线+空心三角形 l发现变化,并封装变化 l在软件设计之初,需求发现所要开发软件中能够存在或曾经存在的“变化〞,然后利用笼统的方式对这些变化进展封装笼统是没有详细的代码实现,笼统代表了一种可扩展 l参阅教材例9.1单一职责原那么和最少知识原那么 l在单一职责〔Single Responsibility Principle, 简称为SRP〕中,就一个类而言,应该仅有一个引起它变化的缘由也就是说,不要把变化缘由各不一样的职责放在一同。
单一职责原那么和最少知识原那么 l最少知识原那么〔Least Knowledge Principle, 简称为LKP〕又叫迪米特法那么〔Law of Demeter,简写为LoD〕,就是说一个对象该当对其他对象有尽能够少的了解就像我国古代老子所说的“使民无知〞和“小国寡民〞的统治之术,“是以圣人之治,虚其心,实其腹,弱其志,常使民无知无欲〞以及 “小国寡民……邻国相望,鸡犬之声相闻,民至老死,不相往来〞开放-封锁原那么 l所谓“开放-封锁原那么〞〔Open-Closed Principle〕,也称“开-闭原那么〞,就是让设计对扩展开放,对修正封锁也就是说,不允许更改的是系统的笼统层,而允许更改的是系统的实现层高层模块不应该依赖低层模块,笼统不应该依赖细节,使系统设计更为通用、更为稳定面向笼统编程,这里的笼统主要指的是笼统类或接口开放-封锁原那么l“开放-封锁原那么〞本质上是指当一个设计中添加新的模块时,不需求修正现有模块l 子类型可以交换基类型原那么 l子类型可以交换基类型原那么也叫里氏代换原那么子类型可以交换基类型原那么也叫里氏代换原那么〔〔Liskov Substitution Principle ,简称,简称LSP〕,里氏代换原那么中说,任何基类可以出现〕,里氏代换原那么中说,任何基类可以出现的地方,子类一定可以出现,且程序运转正常。
的地方,子类一定可以出现,且程序运转正常l特别提示:在进展设计的时候,我们尽量从笼统类特别提示:在进展设计的时候,我们尽量从笼统类承继,而不是从详细类承继假设从承继等级树来承继,而不是从详细类承继假设从承继等级树来看,一切叶子节点该当是详细类,而一切的树枝节看,一切叶子节点该当是详细类,而一切的树枝节点该当是笼统类或者接口点该当是笼统类或者接口l l程序参考例程序参考例9.3合成/聚合复用原那么l“优先运用对象组合,而不是类承继〞是面向对象设计的又一个原那么并不是说承继不重要,而是由于每个学习OOP的人都知道OO的根本特性之一就是承继,以致于承继曾经被滥用了,而对象组合技术往往被忽视了l一个类的成员变量可以是一个类创建的对象,那么该类创建的对象就包含了其他类的对象,也就是说该对象由其他对象组合而成了对象与所包含的对象属于弱耦合关系,由于假设修正当前对象所包含的对象的类代码,不用修正当前对象的类的代码9.3 面向对象的设计方式l方式是针对特定场景下的特定问题的可反复、方式是针对特定场景下的特定问题的可反复、可表达的处理方案可表达的处理方案l假设他期望成为一名出色的假设他期望成为一名出色的Java软件开发软件开发者,就应该学习设计方式。
者,就应该学习设计方式l面向对象方式代表了一种思想,而不是详细面向对象方式代表了一种思想,而不是详细细节 战略方式的定义和构造lThe Strategy Design Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithms vary independently from the clients that use it.〔战略方式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互交换战略方式让算法独立于运用它的客户而独立变化〕l算法就是需求完成某项义务的过程算法是个过程——包含一些指令序列,接受收入,产生输出单个方法也许也是个算法:它接受输入——其参数列表——并产生输出作为前往值在某些情况下,算法也许完全包含在一个方法中,但是算法的实现经常依赖于多个方法的相互作用l案例见教材9.3.2 l构造和角色分析:构造和角色分析:l〔〔1〕〕Context(运用场景运用场景)l 需求运用需求运用ConcreteStrategy提供的算法提供的算法,表达在程序的表达在程序的35行,行,42行、行、44行和行和46行。
行l 内部维护一个内部维护一个Strategy的实例,表达在程序的的实例,表达在程序的28行l 担任动态设置运转时担任动态设置运转时Strategy详细的实现算法,表达在程详细的实现算法,表达在程序的序的42行、行、44行和行和46行l 担任跟担任跟Strategy之间的交互和数据传送,表达在之间的交互和数据传送,表达在28-31行l〔〔2〕〕Strategy(笼统战略类笼统战略类)l 定义了一个公共接口,各种不同的算法以不同的方式实现这定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,个接口,Context运用这个接口调用不同的算法,普通运用接运用这个接口调用不同的算法,普通运用接口或笼统类实现口或笼统类实现l〔〔3〕〕 ConcreteStrategy(详细战略类详细战略类)l实现了实现了Strategy定义的接口,提供详细的算法实现定义的接口,提供详细的算法实现 中介者方式的构造与运用 l官方战略方式的定义:The Mediator Pattern define an object that encapsulates how a set of objects interact.l中介者方式用一个中介对象来封装一系列的对象交互,从而使它们可以较松散的耦合。
表达“优先运用对象组合,少用承继〞的原那么 中介者方式的角色 〔1) 笼统中介者〔Mediator〕:定义一致的接口,用于各同事角色〔Colleague〕之间的通讯 〔2) 详细中介者〔Concrete Mediator〕:详细中介者是实现中介者接口的类经过协调〔coordinating〕各同事角色〔Colleague〕实现协作行为〔cooperative behavior〕为此它要知道并援用各个同事角色 〔3) 同事〔Colleague〕:一个接口,规定了详细同事需求实现的方法每一个同事角色都知道对应的详细中介者,而且与其他的同事角色通讯的时候,一定要经过中介者协作 运用见9.3.3案例模板方法的构造与运用 l The Template Method Pattern defines the skeleton of an algorithm in a method, deferring some steps to subclasses. Template method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.l模板方法方式:在一个方法中定义一个算法的骨架,而将一些实现步骤延迟到子类中。
模板方法使得子类可以在不改动算法构造的情况下,重新定义算法中的某些步骤 l 模板方法要点: l〔1〕 模板方法中的非final方法〔默许实现或不做事的方法〕称为“钩子〞 l〔2〕 钩子可以简化子类的实现 l〔3〕 钩子可以让子类可以有时机对模板方法中某些即将发生的〔或刚刚发生的〕步骤做出反响 l〔4〕 primitiveMethod的命名最好加上do前缀 l〔5〕 工厂方式为模板方法方式的特例 l〔6〕 除了可以灵敏应对子步骤的变化外,“不用调用我,让我来调用他〞的反向控制构造是Template Method的典型运用 l〔7〕 模板方法是代码复用的一项根本的技术,在类库中尤其重要它遵照“笼统类该当拥有尽能够多的行为,该当拥有尽能够少的数据〞的重构原那么 l相关程序见教材。
