面向对象七大原则与设计模式


前言

在日常的项目开发中,随着项目的迭代,项目的复杂度往往时呈指数式的增加,而项目在不断增加新的需求的同时还得不断地改进原来的问题,此时开发者往往同能同时兼顾,从而往往都会写出补丁式的代码,可读性差的同时还容易引起其他的问题。而好的设计模式却能简化我们项目的复杂度,使得项目更易于维护,和拥有更好的可读性


一、面向对象七大原则?

面向对象的七大原则是写出优秀代码的核心指导思想,也是设计模式的设计依据,因此掌握七大原则对于每一个使用面向对象语言的开发者都是非常重要的

1.职责单一原则(Single Responsibility Principle, SRP)

定义:就一个类而言,应该仅有一个类引起它变化的原因
字面意思很容易理解,但是通常在开发中总是不知道某些方法该属于哪一个类,比如一个Android开发将所有的代码都写在一个activity中,就会导致无论是逻辑改变还是UI修改都可能需要去该activity的代码,从而造成activity代码堆积,随着代码量的增大,代码之间的耦合度也会增加,从而导致修改一个功能的时候,其他功能也会受到影响,因此复杂度也会大大的增加。所以职责足够单一的类能给我们带来好处有1.降低代码复杂度 2.可维护性高 3.变更带来的风险小 4.可读性高

2.开闭原则(Open Close Principle, OCP)

定义:软件中的对象应该对于扩展时开放的,对于修改是封闭的。
通常软件都是在不断的变化的,而在需要不断地变化时,我们需要去保证原有的功能不受新需求的影响而引入bug,扩展原有的类对象则是达成这一目的的更好选择,而不是修改当前对象。我们应当尽量在只有该对象出现问题时才去修改该对象

3.里氏替换原则(Liskov Substitution Principle, LSP)

定义:所有引用基类的地方必须能透明的使用其子类对象。即在代码中把所有使用基类的地方全部换成子类,程序不会出现异常,反之则不一定成立。里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法
里氏替换原则是实现开闭原则的重要手段之一。

4.依赖倒置原则(Dependence Inversion Principle, DIP)

定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。在java中依赖倒置的表现是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的

5.接口隔离原则(Interface Segregation Principles, ISP)

定义1:客户端不应该被迫依赖于它不使用的方法
定义2:一个类对另一个类的依赖应该建立在最小的接口上
接口隔离原则将非常庞大、臃肿的接口拆分成更小的和更具体的接口,让客户端依赖的接口尽可能的小,这样客户将会至需要知道他们感兴趣的方法。接口隔离原则的目的是系统接口耦合,从而更易重构,更改和重新部署

6.迪米特法则(Law of Demeter, LOD)

定义:一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话
从迪米特法则的定义和特点可知,它强调以下两点:
1.从依赖者的角度来说,只依赖应该依赖的对象。
2.从被依赖者的角度说,只暴露应该暴露的方法

7.合成复用原则(Composite Reuse Principle,CRP)

定义:尽量使用对象组合,而不是继承来达到复用的目的
通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的内部细节通常对子类来说是可见的,所以这种复用又称“白箱”复用,如果基类发生改变,那么子类的实现也不得不改变,从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性,而且继承只能在有限的环境中使用。

二、设计模式

设计模式按照其作用目的分为三类:创建型模式,结构型模式,行为型模式
创建型模式:单例模式,建造者模式,工厂模式,抽象工厂模式,原型模式等。
该类模式用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。
结构型模式:代理模式,适配器模式,外观模式,桥接模式,装饰模式,组合模式,享元模式等。
该类模式用于描述如何将类或对象按某种布局组成更大的结构
行为模式:观察者模式,模板方法,策略模式,访问者模式,命令模式,状态模式,责任链(职责链)模式,迭代器模式,中介模式,备忘录模式,解释器模式等
该类模式用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。

而按照其作用范围又可分为:类模式,对象模式
类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。工厂方法、(类)适配器、模板方法、解释器属于该模式
对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。除了以上 4 种,其他的都是对象模式。

猜你喜欢

转载自blog.csdn.net/weixin_38358978/article/details/113824050