拉勾教育重温设计模式系列 面向对象基础知识
拉勾IT课小编为大家分解
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)重载:一个方法有多个不同个数,不同类型,不同顺序的参数的方法,称为方法的重载。
比如:
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原则
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)重载:一个方法有多个不同个数,不同类型,不同顺序的参数的方法,称为方法的重载。
比如:
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原则