开闭:扩展开放,修改关闭,尽量在不修改原有代码的情况下进行扩展,需通过对抽象(抽象类,接口)进行实现进行扩展
单一职责:一个类只负责一个职责,应该只有一个引起它变化的原因。职责分离,不同职责封装在不同类中,实现高内聚,低耦合
里氏替换:所有引用基类(父类)的地方必须能透明地使用其子类的对象,表明子类是在父类的基础上进行的扩展,大多数都是代码中给定父类的静态类型,运行中确定子类的动态类型
依赖倒置:针对接口(而不是实现)编程,抽象不应该依赖于细节,细节应当依赖于抽象,尽量使用(接口,抽象类)进行声明,方法传递
举例:通过构造函数,setter或其他业务方法进行依赖注入,注入位置声明抽象类型,那么只有在运行时才能确定具体实现类,即运行时才能确定程序具体行为。
接口隔离:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。(接口太小,接口泛滥,接口太大,不利于使用)
迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用。保持松散的耦合关系(降低耦合度),保证自己的修改会尽量少地影响其他模块,利于扩展,尽量创建松耦合的类,尽量降低成员变量和成员函数的访问权限,尽量设计为不可变类,尽量少引用其他对象,考虑使用中间类(层)来降低耦合
组合/聚合复用:组合(内部组件) , 聚合(共用组件),这两种都是委托关系
更多考虑组合/聚合(has),而不是继承(is),is带有强烈的依赖关系,只有确定存在这种稳定的、不变的is关系才用继承。