本文是我在读《设计模式之禅》这本书时所提炼出来的一些关键点,比较笼统,是我想在以后用他来温故知识,基本不适用于普通阅读,如有看不明白的地方还望翻书至原章原节....
一、单一职责原则(SRP):接口一定要做到单一职责,类的设计要尽量做到只有一个原因引起它的变化
二、里氏替换原则(LSP):
1、在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则
2、子类必须完全实现父类的方法。如果子类不能完整的实现父类的方法,或者父类的某些方法在子类中已经发生了“畸变”,则建议断开父子继承关系,采用依赖、聚合、组合等关系代替继承。(这点是书上明确要求的,但是个人觉得还是分情况去对待吧,读过太多子类没有完全实现父类代码的说.......)
3、覆盖或实现父类的方法时输入参数可以被放大
4、覆写或者实现父类方法时输出结果可以被缩小
三、依赖倒置原则(DIP):
(一)、含义:
1、模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的
2、接口或抽象类不依赖于实现类
3、实现类依赖接口或抽象类
(二)、写法
1、构造函数传递依赖对象
2、Set方法传递依赖对象
3、接口声明依赖对象,也叫接口注入
(三)规则
1、每个类尽量都有接口或抽象类,或者两者都具备
2、变量的表面类型尽量是接口或者是抽象类
3、任何类都不应该从具体类派生(这个不是绝对遵循,视情况而定)
4、尽量不要覆写基类已实现的方法
5、结合里氏替换原则使用
四、接口隔离原则(换个角度看,类也是一种接口,实例接口):
单一职责是要求类和接口的职责单一,注重职责,属业务逻辑上的划分,而接口隔离原则要求接口的方法尽量少
规则:
1、根据接口隔离原则拆分接口时,首先必须满足单一职责原则,即一个接口只服务于一个子模块或者业务逻辑
2、接口要高内聚,尽量少公布public方法(貌似这点跟C#相冲......),书上原话是接口是对外的承诺,承诺越少对系统的开发越有利...
3、定制服务:一个系统或系统内的模块之间必然会有耦合,有耦合就要有互相访问的接口,而接口只提供访问者必要的方法
4、接口设计是有限度的
五、迪米特法则(LoD)--也称为最少知识原则(LKP):
1、类与类之间的 关系是建立在类间的,而不是方法间,因此一个方法尽量不引入一个类中不存在的对象
2、尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,
3、如果一个有一个可以放在多个类中的方法,那么要尽量选取即不会引起类间关系也不会产生负面影响的类
4、谨慎使用Serializable
六、开闭原则:
1、抽象约束
a:通过接口或抽象类扩展,对扩展进行边界限定,不允许出现抽象类或接口中不存在的public方法
b:参数类型、引用对象尽量使用接口或者抽象类,而不是实现类
c:抽象层尽量保持稳定,一旦确定就不应该再进行修改
2、元数据控制模块行为
3、制定项目章程
4、封装变化