基础认识
Object Oriented Programming 面向对象编程
从开始学java以来就知道是面向对象的了,new 出来的就是一个对象,类就是一个对象,但是你让我说具体对象是什么,我还是不太明白,下面来搞懂他
在编程比较简单的时候,出现的是面向过程这个词,面向过程这个事儿就是一个非常具体的事儿,
比如你在家里想要吃鱼香肉丝,有两种方式,一种是你自己去做,另外一种是点个外卖
迪米特法则又叫最少知道原则,一个对象应当对其他对象有尽可能少的了解。迪米特法则简单的说就是如何做到”低耦合”,门面模式和调停者模式就是对迪米特法则的践行。
一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
- 你需要自己去买做鱼香肉丝的原料,然后自己进去厨房,把这道菜做出来,你才可以吃到鱼香肉丝,这其实就是面向过程,过程中的每个事情都很具体,你需要清楚所有的问题。
- 外卖小哥直接送货上门,不需要你操心,只需要你报菜名,付钱即可,这就是面向对象
面向过程:
优点:性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。
缺点:不易维护、不易复用、不易扩展
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 .
缺点:性能比面向过程差
面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了
三大基本特征
封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
继承
提高代码复用性;继承是多态的前提。
多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性
七大原则
单一职责原则
Single Responsibility Principle 简称SRP
一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;提高类的可读性,提高系统的可维护性;变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则
里氏替换原则
Liskov Substitution Principle 简称 LSP
里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。
里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
使用里氏替换原则时需要注意,子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法。运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。
Java的多态就属于这个原则。
依赖倒置原则
Dependence Inversion Principle 简称 DIP
具体依赖抽象,上层依赖下层。该原则说得直白和具体一些就是声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代,
采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减少并行开发引起的风险,提高代码的可读性和可维护性。从大局看Java的多态就属于这个原则。
接口隔离原则
Interface Segregation Principle 简称 ISP
迪米特法则
Law Of Demeter
迪米特法则又叫最少知道原则,一个对象应当对其他对象有尽可能少的了解。迪米特法则简单的说就是如何做到”低耦合”,门面模式和调停者模式就是对迪米特法则的践行。
一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
开闭原则
Open Close Principle
开放封闭原则主要体现在对扩展开放、对修改封闭。意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。而不需要对原有系统进行修改。
可以通过Template Method模式和Strategy模式进行重构,实现对修改封闭,对扩展开放的设计思路。
封装变化,是实现开放封闭原则的重要手段,对于经常发生变化的状态,一般将其封装为一个抽象,但是要拒绝滥用抽象,只将经常变化的部分进行抽象
组合/聚合复用原则
Composite/Aggregate Reuse Principle
优先使用聚合或合成关系复用代码。通过继承来复用代码是面向对象程序设计中被滥用得最多的东西,因为所有的教科书都无一例外的对继承进行了鼓吹从而误导了初学者,类与类之间简单的说有三种关系,Is-A关系、Has-A关系、Use-A关系,分别代表继承、关联和依赖。其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成,但说白了都是Has-A关系,合成聚合复用原则想表达的是优先考虑Has-A关系而不是Is-A关系复用代码,
组合/聚合复用原则可以使系统更加灵活,类与类之间的耦合度降低。一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用。
其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。
需要说明的是,即使在Java的API中也有不少滥用继承的例子,例如Properties类继承了Hashtable类,Stack类继承了Vector类,这些继承明显就是错误的,更好的做法是在Properties类中放置一个Hashtable类型的成员并且将其键和值都设置为字符串来存储数据,而Stack类的设计也应该是在Stack类中放一个Vector对象来存储数据。记住:任何时候都不要继承工具类,工具是可以拥有并可以使用的,而不是拿来继承的。