面向对象其实是种思想,凡是思想都是比较抽象的,所以我们总要找到一些方法使它便于我们理解;建模就是最常用的方式,而建模的一个特点就是减少关注度,尽量减少对具体细节
面向对象其实是种思想,凡是思想都是比较抽象的,所以我们总要找到一些方法使它便于我们理解;建模就是最常用的方式,而建模的一个特点就是减少关注度,尽量减少对具体细节的关注,这在面向对象三大特性中深有体现。
其实面向对象的三大特性并不是面向对象所必需的,只是在面向对象建模时为了解决一些共性的问题而总结出来的;具体三大特性的由来和要解决的问题看“三大特性解释”。而五大原则则是在实现这三大特性时或者说再具体操作这三大特性时,为了让我们少走弯路,经过长时间积累和验证,总结出来一些行之有效的思维方式。而设计模式则是具体经典场景的解决方案。
面向对象的三大特性:
封装
封装就是把客观事物封装成抽象的类,并且此类可以把自己的属性和方法只对信任的类开放,对不信任的类封闭。
换句话说,我们之所以封装就是为了减少我们对一个对象的所包含内容的关注度,对外界来说我只关心这个对象,能做什么事情,具体这个对象如何具有这些特性,或者如何做事情的我不关心,为了达到这个目的,我们就有必要对这个对象进行封装,把那些对于外界来说不需要关心的东西封装起来,不对外暴露。
继承
继承是让某个类型的类 获得另一个类型的类型的属性或方法。它是指这样一种能力,它可以使用现有类的所有功能,并且在不编写原有类的情况下对这些功能进行扩展。
换句话说,在我们考虑一类东西的不同对象时,会发现这些对象具有某些共同的特性,这样我们就可以把这些特性抽出一个父类,二子类只需要继承这个父类就行了,这样这些共有的特性就有一个对象来管理,同时其子类又具备这些特性,这样就避免了同一个东西有不同对象控制所带来的问题。
多态
是指一个实例的同个方法在不同的形态下有不同的表现形式。比如,一个类中具有多个方法名相同的方法,但是每个方法的所包含的参数是不一样的,这包括,参数个数不一样,或者参数的类型不一样,或者两者都不一样。
换句话说,一个对象在不同条件下做同一个事情的不同表现形态。
面向对象的五大原则:
单一职责原则
一个类应该只有一个引起它变化的原因,也就是说一个类的职责要单一不能保罗万象。(最近简单,最容易理解,确实最难做到的设计)
开放封闭原则
既是开放的又是封闭的,对扩展是开放的,对更改是封闭的,
例如,在对一个软件需要做出修改时,如果能够做到,不修改原有的源代码,就可以完成功能的扩展,那这个软件设计就是符合开闭原则的。
这个原则在我设计类时很有帮助,坚持这个原则就必须酒量考虑接口的封装,抽象机制和多态技术。
替换原则
依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。所谓抽象就是抽类或者接口,不能直接实例化的。细节就是具体的实现类,实现接口或者继承抽象类所产生的类,可以通过关键字new直接实例化的。
依赖倒置的本质是契约式编程,通过抽象是个各类和模块的实现相互独立,不相互影响,是各模块间实现松耦合。
例如,类A直接依赖类B,假如需要类A改为依赖类C,则必须通过代码来时达成。在这种情况下,类A所欲高层,负责具体的复杂业务实现,类B和类C属于底层,负责基本的原子操作,如果直接修改类A的话就会给程序员带来额外的风险。
解决方案,就是类A依赖一个接口I,而类B和类C实现这个接口I,类A和类B,类C间接地建立联系,这样就会大大的见地类A修改的风险。
依赖倒置给予这样一个事实,相对于细节的东西,抽象的东西要稳定的多,基于抽象的系统要比基于细节的系统稳定的多,可维护性更强。
接口隔离原则
这个原则的意思就是:使用多个专门的的接口比使用单个接口要好的多
例如,在实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现的时候花了太多的精力,而接口所定义的操作相当于对客户端的承诺,这种承诺当然是越少越好,越精炼越好,过多的承诺带来的就是你的大量精力和时间去维护!
oo编程开发的范式:
划分对象----->抽象成类----->将类组织成为层次化结构----->用类和实例进行设计和实现
面向对象编程设计的几个阶段:
第一个阶段
面向名词(POJO):就是为了数据的存储,主要是通过设计出来的数据库具体信息区理解和分析系统
POJO注重的是类的属性,但有些面向对象注重的是特性,也就是方法。
第二个阶段
也是抽取名词,但是主要是通过名词的概念去理解系统,包括系统包含的模块以及通过名词了解系统各模块之间的关系,在具体点就是名词之间的业务流程;而面向过程:主要注重业务实现的逻辑。
第三个阶段
主要是在解决一些系统设计时复杂的算法,复杂的逻辑,主要是用到设计模式来解决。
学习设计模式:《大会西游之设计模式》《head first 设计模式》
学习套路:关注每个设计模式之前所描述的问题,自己思考如果自己遇到这样的问题该怎么解决,然后对比看看设计是怎么解决的,这样来学习设计模式就更高效也更能深入的理解。
在用面向对象抽取对象名词时,什么时候应该拆分名词?
一份对象的固有属性就是能够体现这个对象生命周期的的属性,是在描述这个对象时不可缺少的属性,其他的属性原则上都是可以拆开的。
另外,抽实体还应遵从原子性,要弄明白名词属性的来龙去脉,一般手动输入的,或者操作产生的就是原子属性。
冗余字段的原则?
一旦生成就不能改变,话句话说,此字段所描述对象的职责不会发生改变,你这个字段就是可以冗余的。