单一职责原则:
- 详解:应该有且仅有一个原因引起类的变化,建议在实际中做到:接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。也可以细分为类的单一职责和方法的单一职责。
- 正例——类的单一职责:实现打电话功能,可以定义两个类,一个类负责拨通电话和挂断电话(协议管理),另一个类负责通话(数据传送)
- 正例——方法的单一职责:当远程连接时,可以将封装连接地址的属性(ip/port)和封装协议放在两个不同的方法中
里氏替换原则:
- 详解:所有引用基类的地方必须能透明地使用其子类对象(只要父类能够出现的地方子类就可以出现)
- 注意:子类可以扩展父类的功能,但不能改变父类原有的功能
- 如果子类不能完整的实现付类的方法,或者父类的某些方法在子类中发生“畸变”(改变了父类原有的逻辑),则建议断开父子继承关系,采用依赖、聚合、组合等关系来代替继承。
- 一定要慎用继承,因为继承是侵入性的,降低了代码的灵活性,增加了耦合性
依赖倒置原则:
- 详解:高层模块不应该依赖底层模块,两者都应该依赖其抽象;接口/抽象类不应该依赖实现类;实现类应该依赖接口或抽象类
- 反例:几个人正在java、大数据,如果每个人用一个类写两个方法分别表示我学习java和大数据,扩展性很差;
- 正例:但是如果我定义一个person接口,一个course接口,person接口中有learn方法,传入course参数,course接口中有learnCurrentCourse方法,learn方法中调用learnCurrentCourse方法
接口隔离原则:
- 详解:用多个专门的接口而不是一个单一的总接口。
- 对比:单一职责要求的是类和接口的职责尽量单一,注重的是职责,这是业务逻辑上的划分,而接口隔离原则要求接口的方法尽量少。
- 正例:一个类对一个类的依赖应该建立在最小的接口上,并且接口和类尽量使用原子接口和原子类来组装
- 反例:一个美女的描述接口,分别有嘴、眼睛、耳朵、鼻子、身材等等抽象方法,但是如果一个人只看重身材,他去实现美女接口时本应该只实现身材方法就可以了,但是却需要实现所有方法。
德米特法则(最少知道原则):
- 详解:一个对象应该对其他对象有最少的了解
- 反例:体育老师让体育委员统计班级认数时,体育老师的方法中将班级人员list传入体育委员,体育委员进行统计。
- 正例:体育老师需要的只是班级认数,所以对班级人员list并不感兴趣,所以体育老师不应该知道班级人员信息,也就是说班级人员list应该是体育委员自己生成的而不应该是体育老师传给体育委员的
开闭原则:
- 详解:对扩展开发,对修改关闭
- 实例:定义课程接口,接口中定义了不同课程之间共性的方法(例如设置课程时间和地点),每增加一个课程实现该接口