第十一章——面向对象技术(选做15+)
第十一章 面向对象技术(选做题15+)
11.1 基本概念
面向对象=对象+分类+继承+通过消息的通信
-
对象
在面向对象的系统中,对象是基本的运行实体,它既包括数据(属性),也包括作用于数据的操作(行为),所以一个对象把属性和行为封装为一个整体。从程序设计者角度看,对象是一个程序模块,从用户角度看,对象为他们提供了所希望的行为。在对象内的操作通常叫作方法。一个对象通常可由对象名、属性和操作3部分组成。 -
消息
对象之间进行通信的一种构造叫作消息。当一个消息发送给某个对象时,包含要求接收对象去执行某些活动的信息,接收到消息的对象经过解释,然后予以响应,这种通信机制叫作消息传递。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。 -
类
一个类定义了一组大体上相似的对象,一一个类所包含的方法和数据描述一组对象的共同行为和属性。类是在对象之上的抽象,对象是类的具体化,是类的实例。 -
继承
继承是父类和子类之间共享数据和方法的机制。这是类之间的一种关系, 在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
一个父类可以有多个子类,这些子类都是父类的特例,父类描述了这些子类的公共属性和操作。一个子类可以继承它的父类中的属性和操作,这些属性和操作在子类中不必定义。子类中还可以定义自己的属性和操作。 -
多态
不同的对象收到同一消息可以产生完全不同的结果,这一现象叫作多态。在使用多态的时候,用户可以发送一个通用的消息,而实现的细节则由接收对象自行决定,这样,把具有通用功能的消息存放在高层次,而把不同的实现这一功能的行为放在较低层次,在这些低层次上生成的对象能够给通用消息以不同的响应。
11.2 设计原则
- 单一职责原则:设计目的单一的类。
- 开放—封闭原则:对扩展开放,对修改封闭。
- 李氏(Liskov)替换原则:子类可以替换父类。
- 依赖倒置原则:要依赖于抽象,而不是具体实现:针对接口编程,不要针对实现编程。
- 接口隔离原则:使用多个专门的接口比使用单一的总接口要好。
- 组合重用原则:要尽量使用组合,而不是继承关系达到重用的目的。
- 迪米特(Demeter)原则:一个对象应当对其他对象有尽可能少的了解,
11.3 设计模式的概念与分类
设计模式:主要关注软件系统的设计,与具体的实现语言无关
设计模式一般有以下4个要素:
- 模式名称。用一两个词来描述模式的问题、解决方案和效果。设计模式允许在较高的抽象层次上进行设计。
- 问题。描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,可能描述了特定的设计问题,如怎样用对象表示算法等;也可能描述了导致不灵活设计的类或对象结构。
- 解决方案。描述了设计的组成成分、它们之间的相互关系及各自的职责和协作方式。模式就像一个模板,提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
- 效果。描述了模式应用的效果及使用模式应权衡的问题。
设计模式的分类:
11.4 创建型模式
创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
创建型模式中有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些具体的类的信息封装起来。第二,它们隐藏了这些类的实例是如何被创建和放在一起的整个系统关于这些对象所知道的是由抽象类所定义的接口。
因此,创建型模式在为什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的“产品”对象配置一个系统。配置可以是静态的(即在编译时指定),也可以是动态的(在运行时指定)。
设计模式名称 | 简要说明 |
---|---|
抽象工厂模式(Abstract Factory) | 提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类 |
构建器模式(Builder) | 将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示 |
工厂方法模式(Factory Method) | 定义一个创建对象的接口,但由子类决定需要实例化哪一个类。工厂方法使得子类实例化的过程推迟 |
原型模式(Prototype) | 用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象 |
单例模式(Singleton) | 保证一个类只有一个实例,并提供一个访问它的全局访问点 |
11.5 结构型模式
结构型模式涉及如何组合类和对象以获得更大的结构,结构性模式采用继承机制来组合接口或实现。
结构型对象模式不是对接口和实现进行组命,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。
11.6 行为型模式
行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。
行为类模式使用继承机制在类间分派行为,主要有Template Method(模板方法)和Interpreter(解释器)两种模式。
行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。其他的行为对象模式常将行为封装在一个对象中并将请求指派给它。
11.7 java程序设计
优点:
- 跨平台。
- 代码可移动(与html相结合)。
- 完全面向对象。
- 编出来的程序不易出错(没有指针,内存垃圾自动回收,不会产生内存泄露)
此外,还有简单、安全、多线程等优点。
Java与C++的区别:
- 完全面向对象:无全局变量、无结构和联合、自动回收内存垃圾。
- 没有指针。
- 没有多继承。
- 解释执行。
11.7.1 基本语法
11.7.2 类
一个类是一些属性和方法的封装体,类的定义用关键字class声明,用关键字public、protected、private指定类的成员的存取控制属性:
private(私有)成员
,只有类内部的方法才能访问;
protected(保护)成员
,可被派生类和同一文件夹下的类访问;
public(公有)成员
,可以从类的外部访问。
默认是public。这体现了面向对象的以下指导思想:尽量将类内部的细节隐藏起来,对类的属性的操作应该通过类的方法来进行。
11.7.3 继承
Java中用关键字extends
表示类间的继承关系。
父类的公有属性和方法成为子类的属性和方法,子类如果有和父类同名、同参数类型的方法,那么子类对象在调用该方法时,调用的是子类的方法,亦即方法的重置。如果想要调用父类的同名方法,需要用super
关键字(属性同理)。
子类的对象可以作为祖先类的对象使用,即所谓类的向上转换,反之则不行。具体表现在可以用子类对象来对祖先类对象赋值,可以用子类对象作为实参去调用以父类对象为形参的函数。
11.7.4 重载
同一个类中的两个或两个以上方法,名字相同,而参数个数不同或参数类型不同,叫作重载。
注意:方法名字和参数都一样,而仅仅返回值类型不同,这不是重载。
11.7.5 静态属性和静态方法
静态属性和静态方法的声明用关键字static
实现。一个类的静态属性只有一个,由所有该类的对象共享。不需要创建对象也能访问类的静态属性和方法,访问方式为类名.静态属性或静态方法
。静态方法与对象无关,因此不能在静态方法中访问非静态属性和调用非静态方法。
11.7.6 this、super、final
this代表当前对象,super代表当前对象的父类
this的主要用途有:
- 一个构造函数调用另一个构造函数,对构造函数的调用必须是第一条语句。
- 将对象自身作为参数来调用一个函数。
super的用途:
在子类中调用父类的同名方法,或在子类的构造函数中调用父类的构造函数,此时也必须是第一条语句。
final:
用final关键字定义的常量,在其初始化或第一次赋值后,其值不能被改变。常量必须先有值,然后才能使用。对于常量的第一次赋值只能在构造函数中进行。
final对象的值不能被改变,指的是该对象不能再指向其他对象,而不是指不能改变当前对象内部的属性值。
函数参数声明为final后,函数中的值不能改变。
final方法是不能被重置的方法。
final类不能被继承,其所有方法都是fina的,但属性可以不是final的。
11.7.7 抽象类和接口
-
抽象类
抽象类通过关键字abstract
实现,抽象类的目的是定义一个框架,规定某些类必须具有的一些共性。包含抽象方法的类一定是抽象类,所谓抽象方法是指没有函数体的方法。抽象类的直接派生类必须实现其抽象方法,抽象类只能用于继承,不能创建对象。 -
接口
接口用关键字interface
声明,只能用于继承。注意此时关键字为implements
(实现)。接口用于替代多继承的概念,能实现多继承的部分特点,又避免了多继承的混乱,还能起到规定程序框架的作用。注意:接口也可以用于多态。直接继承了接口的类,必须实现接口中的抽象方法,间接的则可以实现,也可以不实现。 -
抽象类与接口的异同
接口和抽象类都不能创建对象
抽象类不能参与多继承,抽象类可以有非静态的成员变量,可以有非抽象方法
接口可以参与多继承,所有属性都是静态常量,所有方法都是public抽象方法。