前言
在我们很多时候设计代码都是需要用到各种不一样的设计模式的,接下来着几篇给大家领略一下设计模式。知道设计模式的作用,以及在代码的具体体现。很多时候我们看不懂代码就是因为我们不知道它使用的设计模式。
国庆的我很痛苦,学习是痛苦的,成长是快乐的!
一、什么是面向对象
1)面向对象(Object-Orientation,简称OO)是一种系统建模技术/编程思想。
2)面向对象编程(Object-Orientation Programming,简称OOP)是按照OO的方法学来开发程序的编程方式
3) 面向对象分析方法 Object-Oriented Analysis,简称OOA
分析阶段主要解决以下问题:
- 建立针对业务问题域的清晰视图
- 列出系统必须要完成的核心任务
- 针对问题域建立公共词汇表
- 列出针对此问题域的最佳解决方案
此阶段要解决的核心问题是"what to do?"
4) 面向对象设计 Object-Oriented Design, 简称OOD
设计阶段主要解决以下问题:
- 如何解决具体的业务问题
- 引入系统工作所需的各方面的支持元素
- 定义系统的实现策略
此阶段要解决的核心问题是"How to do?"
5)OO: 面向对象,是一套集编程思想,方法,原则,模式,解决方案等为一体的编程模式。OO的思想贯穿于整个软件开发的过程,比如需求分析,设计,编程,测试,升级等。
综上可以知道什么是OOAD?
OOAD(Object Oriented Analysis Design,面向对象的分析和设计,面向对象分析与设计)是现代软件企业广为采用的一项有效技术。OOAD方法要求在设计中要映射现实世界中指定问题域中的对象和实体,
例如:顾客、汽车和销售人员等。这就需要设计要尽可能地接近现实世界,即以最自然的方式表述实体。所以面向对象技术的优点即为能够构建与现实世界相对应的问题模型,并保持他们的结构、关系和行为为模式。
二、面向对象的特点
2.1、抽象
抽象就是将一些事物的共性和相似点抽离出来,并将这些属性归为一个类,这个类只考虑这些事物的共性和相似之处,并且会忽略与当前业务和目标无关的那些方面,只将注意力集中在与当前目标有关的方面。
忽略掉一个对象或实体的细节而只关注其本质特征的过程。
2.2、封装
封装是为了隐藏内部实现细节,是保证软件部件具有优良的模块性的基础。封装的目标就是要实现软件部件“高内聚,低耦合”,防止程序之间的相互依赖性带来的变动影响。
目的:实现信息的隐藏
1)属性信息
2)行为的操作的信息
隐藏方法实现的细节。
代码重用。
2.3、继承
is a
1)子类可以继承父类的属性、方法
2)子类可以有自己的特性存在。
2.4、多态
多态:相同类域的不同对象调用相同方法时的不同表现形式
Personp1=newStudent(); Personp2=newTeacher(); p1.work();//听课 p2.work();//讲课
1)子类继承父类,类实现接口
2)子类重写父类的同名方法,类实现接口中的抽象方法
3)父类的引用指向子类的对象,接口类型的引用指向具体实现类的对象
重写/重载
编译时多态:重载
运行时多态:重写
三、OOP(面向对象编程)
类:属性 方法
抽象 实例化
事物--------------->类-------------->内存中的对象
3.1、对象分类
域对象:在整个对象的设计过程中,侧重于做数据的封装/传递。用来做数据处理的类,信息的载体。POJO,JavaBean.
行为对象:侧重于行为的操作,逻辑的实现。此类对象常见于接口的实现类,抽象类的扩展类.
3.2、类(对象)之间的关系
1)继承关系:is a
2)依赖关系:类A对象中并不需要存在有类B类型的对象属性,而是在使用时,直接在方法中实例化类B(new对象)来调用相关的业务方法来完成整个业务操作。
3)关联关系:对象之间交互时的一种引用方式,当一个对象通过另外一个对象的引用(成员变量)去使用另外一个对象的服务或操作时,两个对象时间便产生了关联。
关联关系又可总体分为聚合关系和组合关系:
聚合关系和组合关系的特点及其区别:
1.聚合关系也称"has-a"关系,组合关系也称"contains-a"关系
聚合(Aggregation): ---Has a---------人拥有电脑
组合(Composition): ---Contains a---人是由脚、身体、头等部分组成的
2.聚合关系表示事物的整体/部分关系的较弱情况,组合关系表示事物的整体/部分关系的较强的情况.
3.聚合关系中,代表部分事物的可以属于多个聚合对象,可以为多个聚合对象共享,而且可以随时改变它所从属的聚合对象.代表部分事物的对象与代表聚合事物对象的生存期无关,
一旦删除了它的一个聚合对象,不一定也就随即删除代表部分事物的对象.
在组合关系中,代表整体事物的对象负责创建和删除代表部分事物的对象,代表部分事物只属于一个组合对象.一旦删除了组合对象,也就随即删除了相应的代表部分事物的对象.
3.3、OOP的过程中核心原则
1)尽量能使用封装的特性就是用封装
2)面向接口编程
3)重组合/聚合而轻继承
四、抽象类和接口的选择问题
4.1、语法角度
Interface:
属性:public static final
方法:只能是抽象方法(JDK8除外)
注意: 可以没有任何方法
作用: 被类实现
abstract class
属性:正常属性
方法:可以是普通方法,也可以是抽象方法
注意: 可以没有任何抽象方法
作用: 被类继承
4.2、设计角度
一个类可以实现多个接口
一个类只能继承一个父类
接口是抽象类的极致的抽象
4.3、思想角度
类进行抽象的时候是否关注属性
尽量让问题域独立存在,尽量不要把所有的属性或者方法都放到一个抽象类或者接口中
4.4、举例
一个关于门的设计问题
门都有俩个基本的行为 open close
将来系统中会出现很多种门(不同的类)
MyDoor1 MyDoor2 MyDoor3 MyDoor4
这些类都具备open close的行为,但是具体实现又不一样.
如何选择:
1.抽象出一个抽象类,类中俩个抽象方法open close
2.抽象出一个接口,接口中俩个抽象方法open close
alarm
将来多了一个新的功能:警报器
1)抽象出一个抽象类,类中俩个抽象方法open close
MyDoor1 extends Door
2)抽象出一个接口,接口中俩个抽象方法alarm
五、设计模式概述
5.1、定义
对软件设计问题的可重用的解决方案.
5.2、作用
1)重用设计比重用代码更有意义,可充分利用已有的软件开发经验.
2)为设计提供共同的词汇,方便交流和书写开发文档.
3)降低错误可能性.
4)节省时间.
好的软件系统设计至少应该具备以下三点:
可扩展性(Extensibility)
灵活性(Flexibility)
可插入性(Pluggability)
5.3、面向对象设计原则
常用基本的设计原则有七个:
1)单一职责原则(Single Responsibility Principle,SRP)
类的职责要单一,不能将太多职责放在同一个类中.
2)开闭原则(Open-Closed Principle, OCP)
对扩展开放,对修改关闭。软件设计应该尽可能的使架构稳定而且又容易满足不同的需求,提高代码可重用性。理论上希望能达到不修改源代码的前提下扩展功能。
3)里氏代换原则(Liskov Substitution Principle,LSP)
在系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。
4)依赖倒转原则(Dependency Inversion Principle,DIP)
要针对抽象编程,而不是针对具体类编程.
5)接口隔离原则(Interface Segregation Principle,ISP)
使用多个专门的接口来取代一个统一的接口.
6)合成复用原则((Composition/Aggregate Reuse Principle,CARP)
系统中尽量使用组合和聚合的关系,而尽量少用甚至不用继承关系。
7)迪米特法则(Law of Demeter, LoD)
一个软件实体应当尽量少的与其他实体发生相互作用.
又叫做最少知道原则。也就是说一个对象应当对其他对象要尽可能少的了解,不要和陌生人说话。
在面向对象中的基本设计原则基础上,又出现了各种各样的设计模式,来解决同一种问题
5.4、面向对象设计模式
1)GRASP模式:General Responsibility Assignment Software Patterns,通用责任分配软件模式
2) GOF模式(四人帮设计模式):Erich Gamma, Richard Helm, Ralph Johnson,John Vlissides软件设计领域的四位世界顶级大师.合著有《设计模式:可复用面向对象软件的基础》,
提出了23种基本设计模式,从理论高度提炼并规范了设计模式,对面向对象设计,软件复用领域产生了巨大影响。