基本设计模式学习笔记:(一)常见的七种面向对象设计原则

时间:2022-10-01 19:27:58

0.概述

      面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,他们是从许多设计方案中总结出来的指导性原则

1.单一原则

     一个类只负责一个功能领域中的相应职责,或者说:就一个类而言,应该只有一个引起它变化的原因。

个人总结:将不同职责的方法放在不同的类中。

2.开闭原则

     软件实体对应扩展开放,而对修改关闭,或者说:软件实体应尽量在不修改原有代码的情况下进行扩展,抽象化是开闭原则的关键。

个人总结:针对相似的功能另外新建一个抽象类,相似功能共同继承此抽象类,以后再有相似功能加入时可以继承此抽象类,在调用方法时中使用上转型对象处理即可。

3.里氏代换原则

     所有引用父类对象的地方能够透明地使用其子类的对象。(注意:使用此方法时子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法,因此尽量把父类设计为抽象类或者接口)

个人总结:在程序中尽量使用父类类型定义对象,在运行时再确定子类类型,使用上转型对象描述。

4.依赖倒转原则

     抽象不应该依赖于细节,细节应该依赖于抽象,或者说:要针对接口编程,而不是针对实现编程。

关键名词:依赖注入:当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象,常用的注入方式有三种:构造注入,设值注入和接口注入。

个人总结:在具体的实现类和调用具体类方法之间引入抽象层。几乎所有具体的实现类中包含的方法都要在接口或抽象类中定义。

5.接口隔离原则

     使用多个专门的接口,而不是用单一的总接口,或者说,客户端不应该依赖那些它不需要的接口,每个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。

关键名词:接口:这里的接口往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言具体的接口定义,有严格的定义和结构,比如Java语言中的interface

个人总结:简而言之就是把功能细化,但在细化过程中又不能太细否则会导致接口过多,如果单凭感觉来分也许分法也不尽相同。

6.合成复用原则

     尽量使用对象组合,而不是继承来达到复用的目的。

个人总结:实现复用时应该多用关联(创建新的关系类,将需要连接的类的方法写入),少用继承。

7.迪米特法则

     一个软件实体应当尽可能少的与其他实体发生相互作用,对于一个对象只能直接与朋友发生交互,其朋友包含以下几类:

         (1)当前对象本身;

         (2)以参数形式传入到当前对象方法中的对象;

         (3)当前对象的成员对象(如果成员对象使一个集合,那么集合中的元素也都是朋友);

         (4)当前对象所创建的对象。

个人总结:主要目的是为了降低系统的耦合度,使类与类之间保持松散的耦合关系,在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限在类的设计上,只要有可能,一个类型应当设计成不变类在对其他类的引用上,一个对象对其他对象的引用应当降到最低