1.单一职责原则:
2.依赖倒置原则:
3.里氏替换原则:
4.接口隔离原则:
5.迪米特法则:
6.开闭原则:
上述是设计模式核心的六个法则,其实可以换一种更准确的说法:
一个指导思想,5个指导方针(注意指导思想和指导方针的区别);
下面会解释上述说法的具体意思:
一个指导思想:
开闭原则:初始定义为一个软件实体(类,方法,模块)应该对扩展开放,对修改关闭;简单在代码上的体现为你设计的代码结构,当需求更改时更多的是可以采用继承或实现的方式来完成,而不应该采用直接修改源代码的方式,当然低层模块的改动需要高层模块进行耦合除外。
开闭原则的核心就是是一个软件更加灵活,具体的表现为高内聚,低耦合。其中的高内聚就是说一个软件实体,尽量保持自身的高度纯洁性,纯洁性体现在三方面:
1.简单:即实体应该保持简单,单一职责;
2.契约:向其他实体公布的共有接口属于当前实体对外部的承诺,不能随意修改契约;
3.封装性:就是除非逼不得已,就不要透露自己的小秘密(实现细节)给别人(其他实体),仅提供给别人功能性的接口就行了;
五个指导方针:为了实现开闭原则而设计的五个实现策略;
1.单一指责原则:应该有且仅有一个原因引起类的变更;简单的说就是一个类或者接口的职责应该单一,一个类负责一件事情,对应到方法上是一个方法应该处理一个事情,这样可以提高这个方法的重用率,使代码更加简洁,且易于维护;该原则难点在于如何定义职责(需要对业务不断分析),职责的粒度大小如何去把控(在项目实现和完美代码之间折中);
2.依赖倒置原则:类间的依赖关系尽量建立在接口和抽象类中;可以解析为一下两点:
2.1高层模块不应该依赖于低层模块,两者都依赖于其抽象;
2.2抽象不应该依赖于细节,细节应该依赖于抽象;
简单的理解就是,类之间的关系应该建立在更高层的抽象层(接口或者抽象类)中,实现类中不发生直接的关系建立;这里的类之间的关系是指类A中使用了类B,那么类B和类A就存在联系;及类A依赖于类B;
3.接口隔离原则:类之间的依赖关系应该建立在最小的接口上;
即:接口要尽量小,这里的难点在于怎么样算尽量小呢?这里需要考虑到单一指责原则和代码的可维护性;一个接口要在单一职责原则基础上,缩小接口,尽量少提供给外部冗余的承诺和尽量实现代码的重用;
4.迪米特法则:最少知识原则,即一个对象应该对自己有依赖的关系类的内部实现指导的最少,尽量实现高内聚和低耦合;
即:类尽量之和自己的直接朋友产生关系,所谓的直接朋友指类A的成员变量或者在方法的输入输出参数中的包含类B,那么类B就是类A的直接朋友;同时尽量少提供公开的方法、相关的成员以及实现细节;
5.里氏替换法则:如果对每一个类型为S的对象s1,都有类型为T的对象t1,使得以T定义的所有程序P在所有的对象s1都替换成t1时,程序p的行为没有发生变化,那么类型S是类型T的子类型;通俗的说就是所有能出现父类的地方子类就是可以出现,并且子类的出现不会导致出现错误 和异常;但是反过来就不行;里氏替换法则主要考虑在子类继承父类的相关注意事项,子类不能歪曲父类的意图(当子类不能完全实现父类的方法的时候/或者重载了一个方法),当发现子类和父类在业务逻辑上出现了分歧时,应该改变他们之间的关系,可以修改为其他依赖关系;