说到设计模式, 其实就是对软件设计过程中存在的普遍问题,所提出的公共的解决方案,能够很好的解决一些常见的问题,其最终目的就是:高内聚低耦合;
使用这七大原则和三大模式来尽可能的提高代码的重用性,可读性和可扩展性。今天我们就先来介绍下对象的七种设计原则。
总述
七种面向对象设计原则
设计原则 | 定义 |
---|---|
单一职责原则 | 一个类只负责一个功能领域中的相应职责 |
开闭原则 | 软件实体应对扩展开放,而对修改关闭 |
里式替换原则 | 所有引用基类对象的地方能够透明地使用其子类的对象 |
迪米特法则 | 一个软件实体应当尽可能的少与其他实体发生相互作用 |
接口隔离原则 | 使用多个专门的接口,而不使用单一的总接口 |
依赖倒转原则 | 抽象不应该依赖于细节,细节应该依赖于对象 |
合成复用原则 | 尽量使用对象组合,而不是继承来达到复用的目的 |
原则简述
单一职责原则
- 定义:
一个类只有一个引起它变化的原因。
- 理解:
对功能进行分类,代码进行解耦,一个类只管一件事
- 举例:
就比如一个网络请求框架大体分为:请求类,缓存类,配置类,不能把这3个混在一起,必须分为3个类去实现不同的功能。
2.开闭原则
- 定义:
一个实体(类、函数、模块等)应该对外扩展开放,对内修改关闭
- 理解:
每次发生变化时,要通过新增代码来增强现有类型的行为,而不是修改原有代码。
- 举例:
解决在迭代过程中加新功能导致对原来框架产生影响。
3. 里氏替换原则
- 定义:
继承必须确保超类所拥有的性质在子类中仍然成立。
- 理解:
在继承类时,除了扩展一些新的功能之外,尽量不要删除或者修改对父类方法的引用,也尽量不要重载父类的方法。
- 举例:
你看啊,就比如Object有个方法,叫equals,如果不遵守里氏代替原则,它的子类重载了equals这个方法,并且返回了个null,这个子类的下一个继承者也会返回null,那么,在不同开发人员开发时,可能考虑不到这个问题,那么就可能导致程序崩溃。
4.迪米特法则
- 定义:
一个模块或对象应尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。
- 理解:
一个对象应该对其他对象有最少的了解;一个类应该对自己需要耦合或调用的类知道得最少,类的内部如何实现、如何复杂都与调用者或者依赖者没关系,调用者或者依赖者只需要知道他需要的方法即可,其他的一概不关心。类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
- 举例:
一般在使用框架的时候,框架的开发者会抽出一个类供外部调用,而这个主要的类像是一个中介一样去调用框架里面的其他类,恰恰框架里面其他类一般都是不可访问(调用)的,这个框架就遵守了迪米特原则,其他开发人员只关心调用的方法,并不需要关心功能具体如何实现。
5.接口隔离原则
- 定义:
使用多个专门功能的接口,而不是使用单一的总接口
- 理解:
在定义接口方法时应该合理化,尽量追求简单最小,避免接口臃肿
- 举例:
在实际开发中,往往为了节省时间,可能会将多个功能的方法抽成一个接口,其实这设计理念不正确的,这样会使接口处于臃肿的状态,这时就需要合理的拆分接口中的方法,另外抽取成一个独立的接口,避免原有的接口臃肿导致代码理解困难。
6.依赖倒置原则
- 定义:
细节应该依赖于抽象,而抽象不应该依赖于细节
- 理解:
高层模块不依赖低层次模块的细节,不依赖具体的类,而是依赖于接口
- 举例:
比如说我们写一个网络框架,为了满足不同开发者的需求,即能使用高效的OkHttp框架,也可以使用原生的API。那么是如何进行切换的呢,这个时候需要面向接口编程思想了,把一些网络请求的方法封装成一个接口,然后分别创建OkHttp和原生API的接口实现类,当然也可以扩展其他网络框架的应用。
7.合成复用原则
- 定义:
尽量使用对象组合,而不是继承来达到复用的目的。
- 理解:
它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
- 举例:
相当于我们开发软件,一个模块的构造,就像搭积木一样,通过组合的形式,完成整体的构建;现在声明式UI框架,对于这种思想比较贯彻。
最后
- 如果觉得看完有收获,希望能给我点个赞,这将会是我更新的最大动力,感谢各位的支持
- 欢迎各位关注我的公众号【java冢狐】,专注于java和计算机基础知识,保证让你看完有所收获,不信你打我
- 如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。