本文对面向对象基础进行一个简单回顾,方便之后理解各种有趣的设计模式,几分钟就可读完。
前言
本人本科专业为软件工程,曾参加过一些算法方面竞赛,因为对研究方面较感兴趣,也是为了进一步扩展知识面,研究生阶段开始投入HCI方面研究,主要是针对视觉方面的人机交互人体目标检测进行研究。
在研究生刚开始阶段曾和实验室小伙伴协同开发过两个企业级WEB方面项目,预计今年九月份都能正式上线:
- ONOS系统(前端)[中国通号院CRSC]
采用Vue框架 - 设备管理系统(全栈)[北京诚星科技有限]
自己搭建环境,后台采用Spring+SpringMVC+Hibernate框架,前端采用EasyUI框架
当然,在这期间也曾遇到项目重构、Bug接连不断等各方面问题,在了解自己能力尚且不足同时,越来越明白设计模式、高内聚低耦合、程序规范化、质量检测等在项目开发中真正的重要性。无论做python开发还是以后做研究,工程类的项目,该思想应该都有值得借鉴之处。因此我准备在文章分类里多添加一个设计模式的分类,在这里对主要经典常用的一些设计模式进行相关介绍总结。相信整体浏览下来你一定能受益匪浅。
知识理解
类与实例化
- 类:具有相同属性和功能的对象的集合;
那么为什么要用类和实例而不是传统的函数调用呢,这就相当于如果居委会的电视放在你家里,而别人家里没有,于是街坊邻里都要到你家来看电视(函数调用),这样并不合适。所以正确的办法应该是将公用的方法放在居委会(类文件)。 - 实例:类的具体对象;
实例化相当于从类工厂又生产出一台电视,任何需要的地方都可以实例化它。
- 类:具有相同属性和功能的对象的集合;
构造方法与方法重载
- 构造方法:
对类进行初始化,比如对于一个猫的实例,我们希望一出生就可以有姓名,那么就应该写一个有参数的构造方法:1
2Cat cat1 = new Cat("喵喵")
Cat cat2 = new Cat("咪咪")
- 方法重载:
提供了创建同名的多个方法能力,可以在不改变原方法基础上,新增功能;重载也算是提供了方法的可扩展能力,比如实例化一个猫的时候给它起不起名字都可以:1
2Cat cat1 = new Cat()
Cat cat2 = new Cat("喵喵")
- 构造方法:
属性与修饰符
属性的getter setter作用是添加控制;
修饰符常用的有public private封装继承多态
- 封装:
每个对象都包含它能进行操作所需要的所有信息 - 继承:
(Java中构造方法不能被继承,继承使得修改和扩展都变得容易,但也增大了两个类之间的耦合性以及破坏包装,将父类暴露给子类) - 多态:
不同的对象可以执行相同动作,但要通过它们自己的实现代码来执行。比如说有一对父子是表演“京剧”的,有一天父亲发高烧上不了台表演,退票的话肯定会大大影响声誉,于是就决定让儿子代父亲上台表演。
这里有几点需要注意:(一)子类以父类的身份出现
;(二)子类在工作时以自己的方式来实现
;(三)子类以父类身份出现时,子类特有属性和方法不可以使用
1
2
3arrayAnimal = new Animal[2];
arrayAnimal[0] = new Cat("小花");
arrayAnimal[1] = new Dog("阿毛");
- 封装:
重构
采用合适的设计模式对原先结构进行重新构建抽象类与接口
- 抽象类:
实例化没有任何意义不能实例化的类
例如说一只猫长得什么样可以想象 ,说动物长什么样,没办法知道。抽象方法必须被子类重写,如果一个类中包含抽象方法也一定是抽象类;实际中看具体情况看父类是否需要改成抽象类。 - 接口:
接口是将隐式公共方法和属性组合起来,以封装特定功能的集合。以下图为例,比如变出东西是小叮当、孙悟空、猪八戒分别具备的功能,如果为了更具有普遍意义而让它们的父类也具有此种功能,显然是不合适的,比如猫并不具备变出来东西功能。所以为了将特定行为进行抽样,采用接口。主要需要注意的是接口与抽象类的区别与联系:
抽象类 接口 对类的抽取 对行为的抽取 对一些相似类对象,用继承抽象类 若行为跨越不同类的对象可使用接口 抽象类是从子类中泛化出父类 接口是不知道子类的存在,预先定义 一个类只能继承一个抽象类 一个类可继承多个接口
- 抽象类:
集合与泛型
- 集合:用于对数据进行存储和检索的专用类叫做集合
比如说ArrayList集合就是对IList接口的实现; - 泛型是具有占位符(参数类型)的类、结构、接口、方法
泛型集合可以将类型参数作为它所存储对对象类型的占位符。1
List <Animal> arraylist;s
- 集合:用于对数据进行存储和检索的专用类叫做集合
委托与事件