重温设计模式系列(二)面向对象基础知识

2022-07-12 08:51:13 浏览数 (1)

本文摘要

文章介绍了面向对象的基础知识,对象,类,抽象,接口等基本概念,面向对象的三大特征以及UML类图的基础知识,作为后续文章的基础。

名词解释

1、抽象:一种思维方式,把具体事物的简单化,概括性描述。

2、UML:通用建模语言

1、对象和类

1.1 对象

在面向对象的世界里,万物皆是对象,动物是对象,植物是对象,对象的本质是什么呢?对象是一个真实存在的事物。比如一个杯子,一碗水都是对象。

用对象的方式描述事物,与面向过程方式来讲,更容易理解,更符合人们的思维习惯。

1.2 类

类是对象的抽象,比如一只小狗,一只小猫,他们的抽象是动物类,也就是说一只小狗,一只小猫是属于动物的一类。

1.3 类与对象的关系

类是对象的抽象,对象是类的实例。一个类可以有多个对象,但一个对象可能只属于一个类。在UML中有类图和对象图的概念。示例如下(更多知识,请自我补充):

1.4 思维过程

通过各个对象找到其共同点,把相同的对象归为一类,就是面向对象的基本思维过程。比如张三,李四是具体的对象,他们都是人类。因此可以抽象出人这个类。

1.5 类的构成

一个类主要有属性和方法(类名,静态块等不展开讲),通称为类的成员,属性表达类的数据部分,方法表示类的行为。比如类Person有name,age等属性,walk(),run()方法。

1.6 类的几个重要概念

(1)实例化 :创建一个对象,一般用new的方式。如:Person tom=new Person();

(2)构造函数:每个类默认有一个公用构造函数,也可以自定义构造函数,一般用于给成员变量赋值或执行一些初始化方法。

(3)重载:一个方法有多个不同个数,不同类型,不同顺序的参数的方法,称为方法的重载。

比如:

代码语言:javascript复制
public void hello()
{
}

public void hell(String name)
{
}

public void hello(int index)
{
}

(4)重写:关键字Override,指子类重写(覆盖)父类的方法,用于改变父类方法的行为。一般用于多态实现。

1.7 接口

类包含数据或行为,但接口是一种契约,主要定义接口的行为,没有方法体,需要类实现接口。一般用于定义规范(抽象行为)和实现松耦合架构。

使用方式:

接口的使用很灵活,可以接口中定义1个或多个方法,一个类可以实现多个接口,但只能继承一个类。

1.8 抽象类

抽象类使用abstract定义,一般用于定义多个类共同拥有的代码。抽象类可以定义抽象方法也可以定义方法体。一般在项目中,用于定义公用代码或定义公用结构,比如模版模式。

2、三大特征

2.1 封装

定义:把与自己相关的数据和行为放到一个类中,对外提供且仅提供必要方法。

解决的问题:隐藏内部细节,提供有限访问接口,使代码内聚,提高易用性

存在的问题:不同的类中,会有相同代码,代码冗余会多,需要对这些代码进行抽象设计

2.2 继承

定义:是一种父子关系,子类继承父类的公有和受保护作用域代码,可以重写父类代码,也可以自定义自己的代码。继承表达的是一种is a的关系。

类图:

解决的问题:代码复用问题,子类复用父类代码,减少代码量,提高可维护性。

存在的问题:

1、父类增加的任何公有或受保护方法都被子类继承,会导致子类有其不需要的行为。

2、继承关系,如果不进行控制,会造成多级继承,当某一父类修改后,影响子类的调用(很容易搞错,是不是该子类应该拥有的)。影响代码的可维护性。

2.3 多态

定义:一个接口有多种不同的实现

解决的问题:屏蔽了各类之间的差异,方便写出通用性强的逻辑,提高代码的灵活性和扩展性。

存在的问题:

1、实现类需要遵循接口的行为约定,否则会出现不匹配的情况。比如:eat()方法原来的意图是定义吃的逻辑,实现时写成了play的逻辑。

2、增加了代码和维护的复杂性。

3、类之间的关系

3.1 泛化关系

泛化是特殊/一般的关系,一般是指继承关系,用于定义父子关系。

3.2 关联关系

类与类之间有一种引用关系,一般有依赖,聚合,组合三种关系。

依赖:一种需要,比如人需要空气,这就是一种依赖。

聚合:一种弱拥有关系(整体与部分的关系),但是两者的生命周期不同,大雁与雁群的关系,就是一种聚合关系。

组合:一种强拥有关系(整体与部分的关系),两者的生命周期相同,比如车与发动机的关系,发动起报废了,车也就报废了。

3.3 高内聚,松耦合

高内聚:是指类内部元素之间的关系,好的内聚是具备良好的封装性,指类内部的数据和行为有且仅是其拥有的,对外只提供必要的访问接口你。一般好的内聚性,更利于维护和复用,只要接口不变,内部如何变化都不需要客户端变。

松耦合:是指类与类之间的关系,好的耦合应该是尽量少的依赖,如果没必要就不产生依赖。一般设计中,采用聚合组合或依赖接口而不是依赖具体实现,隔离这种变化。比如继承,实际上就是一种强耦合关系,如果解决这种耦合,可以采用聚合组合的方式。也就是设计原则中的合成复用原则(后面讲设计原则时会具体讲)

4、面向对象的一般过程

(1)找对象

(2)抽象类

(3)定义类属性

(4)定义类关系

(5)设计检查

5、UML类图

5.1基本元素

(1)类图

类图包含类的名称、属性和方法定义。

类的可见性修饰符:

# protected

无修饰符为 internal

(2)接口

一般只定义接口方法。

5.2元素关系

(1)关联

A 和 B 相互调用和访问对方的元素。

(2)依赖

B 的变化会影响 A,则 A 依赖于 B。

(3)聚合

A 中拥有一个 B,但 B 脱离于 A 仍然可以独立存活。

(4)组合

A 中拥有一个 B,B和A属于同一生命周期,B 脱离 A 后在系统中没有任何存活的意义。

(5)泛化

泛化是一种继承关系,可以是类继承或接口继承。

(6)实现

接口和实现类之间的关系。

下篇预告

重温设计模式系列(三)面向对象设计原则

摘要:比设计模式更重要的是设计思想和设计原则,基于这些原则,逐步产生了不同的设计模式。因此,学好设计模式的基础是掌握基本的设计原则。大纲如下:

1、代码抽象三原则

2、GRASP原则

3、SOLID原则

4、SOC原则

0 人点赞