面向对象的三大特征和六大基本原则

一、面向对象的三大特征

封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。

封装的目的有两个,一是增强安全性和简化编程。使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。二是降低不同类之间的影响。封装使一部分成员充当类与外部的接口,而将其他的成员隐蔽起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。

继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。子类可以扩展自己的方法。抽象程度:父类>子类

多态:即多种状态。接口的多种不同的实现方式即为多态。多态是方法重载、继承、方法重写、自动转型等技术的特性。

多态的实现方式:1.重写和重载;2.接口;3.抽象类和抽象方法。

二、面向对象的六大原则

单一职责原则(SRP:Single responsibility principle)

又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。解决方案就是要解耦和增强内聚性。

开闭原则(OCP:Open Closed Principle)

对于扩展是开放的,对于修改是关闭的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。实现开闭原则的关键就在于“抽象”。把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的

里氏替换原则(LSP:Liskov Substitution Principle)

任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。通俗地讲就是,子类可以去扩展父类的功能,但是不能改变父类原有的功能。

它包含以下几层意思:

子类可以实现父类的抽象方法,但是不能覆盖分类的非抽象方法。

子类可以增加自己独有的方法。

当子类的方法重载父类方法的时候,方法的形参要比父类方法的输入参数更加宽松。

当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。

依赖倒置原则(DIP:Dependence Inversion Principle)

A.高层次的模块不应该以来与低层次的模块,他们都应该以来与抽象。B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

面向过程的开发,上层调用下层,上层依赖于下层,依次当下层发生剧烈变动时,上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。

面向对象的开发很好地解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度。

接口隔离原则(ISP:Interface Segregation Principle)

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。比如说某个接口中有1,2,3,4四个方法。类A只需要到1,3两个方法,类B只需要用到2,4两个方法。但是由于我们让这两个类都去实现了这个接口,因此它们就必须去实现所有的方法,即使它们不要用到这个方法。这显然是不合理的。因此我们应该把这个接口进一步细化,分成一个带有1,2两种方法的接口,和一个带有3,4两种方法的接口。这就是接口隔离原则。

迪米特法则(Law of Demeter)

又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。

因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。

三、总结

1.面向接口编程

2.类和接口的功能尽量单一

3.当需求改变时,我们应该通过扩展来实现新的需求,而不应去修改底层代码

4.降低类和类之间的耦合度(也就是关联性)。尽量把类的属性封装起来,只提供方法给外部。

猜你喜欢

转载自blog.csdn.net/alexwym/article/details/81014694
今日推荐