JAVA面向对象与设计模式.ppt
《JAVA面向对象与设计模式.ppt》由会员分享,可在线阅读,更多相关《JAVA面向对象与设计模式.ppt(69页珍藏版)》请在三一办公上搜索。
1、JAVA,面向对象与设计模式董新军 2013.7.9,面向对象与设计模式,目 录面向对象UML几个概念设计模式,一、面向对象,1.1 为什么面向对象的编程会在软件开发领域造成如此震憾的影响?1.2 面向对象程序设计中的概念 1.3 多态性,1.1 为什么面向对象的编程会在软件开发领域造成如此震憾的影响?,面向对象编程(OOP)具有多方面的吸引力。对管理人员,它实现了更快和更廉价的开发与维护过程。对分析与设计人员,建模处理变得更加简单,能生成清晰、易于维护的设计方案。对程序员,对象模型显得如此高雅和浅显。此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务。每个人都可从中获益,至少表
2、面如此。五大基本特征:(1)所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。(2)程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。(3)每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。(4)每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。(5)同一类所有对象都能接收相同的消息。这一特性称为对象的“可替换性”,是OOP最重要的概念之一。,1.2 面向对象程序设计中的概念,面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面
3、向对象的思想得到了具体的体现。1)对象(Object)可以对其做事情的一些东西。一个对象有状态、行为和标识三种属性。2)类(class)一个共享相同结构和行为的对象的集合。3)封装(encapsulation):第一层意思:将数据和操作捆绑在一起,创造出一个新的类型的过程。第二层意思:将接口与实现分离的过程。4)继承 类之间的关系,在这种关系中,一个类共享了一个或多个其他类定义的结构和行为。继承描述了类之间的“是一种”关系。子类可以对基类的行为进行扩展、覆盖、重定义。5)组合 既是类之间的关系也是对象之间的关系。在这种关系中一个对象或者类包含了其他的对象和类。组合描述了“有”关系。6)多态 类
4、型理论中的一个概念,一个名称可以表示很多不同类的对象,这些类和一个共同超类有关。因此,这个名称表示的任何对象可以以不同的方式响应一些共同的操作集合。7)动态绑定 也称动态类型,指的是一个对象或者表达式的类型直到运行时才确定。通常由编译器插入特殊代码来实现。与之对立的是静态类型。8)静态绑定 也称静态类型,指的是一个对象或者表达式的类型在编译时确定。9)消息传递 指的是一个对象调用了另一个对象的方法(或者称为成员函数)。10)方法 也称为成员函数,是指对象上的操作,作为类声明的一部分来定义。方法定义了可以对一个对象执行那些操作,1.3 多态性,指相同对象收到不同消息或不同对象收到相同消息时产生不
5、同的实现动作。两种多态性:编译时多态性,运行时多态性。a、编译时多态性:通过重载函数实现。b、运行时多态性:通过重写覆盖实现。,二、UML几个概念,2.1 泛化关系(Generalization)2.2 关联关系(Association)2.3 依赖关系(Dependency)2.4 实现关系(Realization),2.1 泛化关系(Generalization),对于面向对象语言,UML中所说的泛化关系就是指类的继承关系。如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一
6、个空心的三角形表示实线的结束。,2.2 关联关系(Association),如果A类中成员变量是用B类(接口)来声明的变量,那么A和B的关系是关联关系,称A关联于B。那么UML通过使用一个实线连A和B的UML图,实线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示实线的结束。,2.3 依赖关系(Dependency),11/7/2023,10,如果A类中某个方法的参数用B类(接口)来声明的变量或某个方法返回的数据类型是B类型的,那么A和B的关系是依赖关系,称A依赖于B。那么UML通过使用一个虚线连A和B的UML图,虚线的起始端是A的UML图,终点端是
7、B的UML图,但终点端使用一个指向B的UML图的方向箭头表示虚线的结束。,2.4 实现关系(Realization),如果一个类实现了一个接口,那么类和接口的关系是实现关系,称类实现接口。UML通过使用虚线连接类和它所实现的接口,虚线起始端是类,虚线的终点端是它实现的接口,但终点端使用一个空心的三角形表示虚线的结束。,三、设计模式,设计模式分类:3.1创建型:与对象的创建有关3.2结构型:处理类或对象的组合3.3行为型:对类或对象怎样交互和怎样分配职责进行描述,Christopher Alexander说:“每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,
8、你就能一次一次地使用该方案而不必做重复劳动。”-典型问题的经典解决方法!,设计模式分类,3.1.1 Factory method(工厂方法)-创建型模式,1.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。2.别名 虚构造器(Virtual Constructor)3.动机 框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。考虑这样一个应用框架,它可以向用户显示多个文档。在这个框架中,两个主要的抽象是类Application和Document。这两个类都是抽象的,客户必须通过它们的子类来做与具体应用相关
9、的实现。例如,为创建一个绘图应用,我们定义类 DrawingApplication和DrawingDocument。A p p l i c a t i o n类负责管理 D o c u m e n t并根据需要创建它们 例如,当用户从菜单中选择 O p e n或New的时候。,3.1.1 Factory method:适用性及参与者,适用性:当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。参与者:Product(Document)定义工厂方法所
10、创建的对象的接口。ConcreteProduct(MyDocument)实现Product接口。Creator(Application)声明工厂方法,该方法返回一个 P r o d u c t类型的对象。C r e a to r也可以定义 一个工厂方 法的缺省实现,它返回一个缺省的 ConcreteProduct对象。可以调用工厂方法以创建一个 Product对象。ConcreteCreator(MyApplication)重定义工厂方法以返回一个 ConcreteProduct实 例。,3.1.1 Factory method模式的UML类图(1),3.1.1 Factory method模
11、式的UML类图(2),3.1.2 Abstruct Factory(抽象工厂),1.意 图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。2.动 机 考虑一个支持多种视感(l o o k-a n d-f e e l)标准的用户界面工具包。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。一个通俗的例子:请MM吃饭,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,虽然口味有所不同,但不管
12、你带 MM 去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的 Factory。,3.1.2 Abstruct Factory:适用性与参与者,适用性:一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库,而只想显示它们的接口而不是实现时。参与者:AbstractFactory 声明一个创建抽象产品对象的操作接口。ConcreteFactory 实现创建具体产品对象的操作。AbstractProduct 为一类产品对象声明一个接口。ConcretePr
13、oduct 定义一个将被相应的具体工厂创建的产品对象。实现AbstractProduct接口。,3.1.2 Abstruct Factory模式的UML类图,3.1.3 Builder(生成器),1.意图 将一个复杂对象的构建与它的内部表示分离,使得同样的构建过程可以创建不同的表示。该模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节,可以强制实行一种分步骤进行的建造过程。2.动机 我们生活当中有许多设备都是以组装的形式存在的,例如台式电脑,那么有些厂商就会推出一些具有默认配置的组装电脑主机,顾客可以购买默认配置的产品,也可以要求厂商重新组装一部不同配置不同组装方式的主机。此时
14、,我们就可以使用建造者模式来满足特殊顾客的要求了。注意到这个例子中厂商是重新组装一部主机,即关注点是主机的每个组成部分,这就符合上面Builder模式给出的使用场景了。,3.1.3 Builder(生成器):适用性、参与者,在以下情况下使用Builder模式:1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 时。2.当构造过程必须允许被构造的对象有不同表示时。参与者:1.Builder 为创建一个Product对象的各个部件指定抽象接口。提供一个检索产品的 接口。2.ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表
15、示。3.Director 构造一个使用Builder接口的对象。4.Product 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。,3.1.3 Builder模式的UML类图,3.1.3生成器模式的优点,11/7/2023,24,生成器模式将对象的构造过程封装在具体生成器中,用户使用不同的具体生成器就可以得到该对象的不同表示。生成器模式将对象的构造过程从创建该对象的类中分离出来,使得用户无须了解该对象的具体组件。可以更加精细有效地控制对象的构造过程。生成器将对象的构造过程分解成若干步骤,这就使得程序可以更加精细,有效地控制整个对象的构造。生成器模式
16、将对象的构造过程与创建该对象类解耦,使得对象的创建更加灵活有弹性。当增加新的具体生成器时,不必修改指挥者的代码,即该模式满足开-闭原则。,3.1.4 Prototype(原型),1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。2.动机 当我们已经拥有某个得来不易的宝贝时,往往我们会很想再“变”一些出来,即这个宝贝的“复制品”,这种方式简单又理想,谁都想要学会这项本事。不可能的事情!不过,这种手段在软件设计中是完全可以实现的,在OO中的原型模式就是这样基于思想的。,3.1.4 Prototype(原型):适用性与参与者,适用性:1.当一个系统应该独立于它的产品创建、构成
17、和表示时。2.当要实例化的类是在运行时刻指定时,例如,通过动态装载。3.为了避免创建一个与产品类层次平行的工厂层次时。4.当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。参与者:1.Prototype 声明一个克隆自身的接口。2.ConcretePrototype 实现一个克隆自身的操作。3.Client 让一个原型克隆自身从而创建一个新的对象。,3.1.4 Prototype模式的UML类图,3.2.1 Adapter(适配器)类对象结构型模式,1.意图 将一个类的接口转换成客户希望的另外一个接口。A d a p t
18、-e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。2.别名 包装器 Wrapper。,3.2.1 Adapter(适配器):适应性与参与者,以下情况使用Adapter模式 你想使用一个已经存在的类,而它的接口不符合你的需求。你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。(仅适用于对象 A d a p t e r)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。参与者:Target 定义Client使用的与特定领域相关的接口。Client 与符合Target
19、接口的对象协同。Adaptee 定义一个已经存在的接口,这个接口需要适配。Adapter 对Adaptee的接口与Ta rg e t接口进行适配。,07/07/13,30,3.2.1 Adapter模式的UML类图(对象适配器),3.2.2 Decorator(装饰模式),1.意图 动态地给一个对象添加一些额外的职责。就增加功能来说,D e c o r a t o r模式相比生成子类更为灵活。2.别名 包装器Wrapper3.动机 有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承
20、机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为 装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作(例如画一个边框)。透明性使得你可以递归的嵌套多个装饰,从而可以添加任意多的功能。,3.2.2 Decorator(装饰模式):适用性及参与者,以下情况使用Decorator模式 在不影响其他对象的情况下,以动态、
21、透明的方式给单个对象添加职责。处理那些可以撤消的职责。当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。参与者:Component 定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。Decorator 维持一个指向Component对象的指针,并定义一个与 Component接口一致的接口。ConcreteDecorator 向组件添加职责。,07/07/13,33,3.2.2 D
22、ecorator装饰模式的UML类图,装饰性功能,3.2.3 Bridge(桥接模式),1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化。2.别名 Handle/Body3.动机 通常方法的弊端:当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。,3.2.3 Bridge:适用性及参与者,适用性:你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可
23、以被选择或者切换。类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时 B r i d g e模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。参与者:Abstraction 定义抽象类的接口。维护一个指向Implementor类型对象的指针。RefinedAbstraction 扩充由Abstraction定义的接口。Implementor 定义实现类的接口,该接口不一定要与 A b s t r a c t i o n的接口完全一致;事实上这两个接口可以完全不同。一般来讲,I m p l e
24、 m e n t o r接口仅提供基本操作,而 A b s t r a c t i o n则定义了基于这些基本操作的较高层次的组合操作。ConcreteImplementor 实现Implementor接口并定义它的具体实现。,07/07/13,36,3.2.3 Bridge模式的UML类图,3.2.4 Proxy(代理模式),1.意图 为其他对象提供一种代理以控制对这个对象的访问。2.别名 Surrogate3.动机 对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。我们考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象(如大型光栅图像)的创建
25、开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。因为并非所有这些对象在文档中都同时可见,所以也没有必要同时创建这些对象。这一限制条件意味着,对于每一个开销很大的对象,应该根据需要进行创建,当一个图像变为可见时会产生这样的需要。但是在文档中我们用什么来代替这个图像呢?问题的解决方案是使用另一个对象,即图像 P r o x y,替代那个真正的图像。P r o x y可以代替一个图像对象,并且在需要时负责实例化这个图像对象。,3.2.4 Proxy:适用性和参与者,适用性:远 程 代 理(Remote Proxy)为 一 个 对 象在 不 同 的 地 址 空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 面向 对象 设计 模式

链接地址:https://www.31ppt.com/p-6510289.html