开闭原则
程序应该对修改关闭,对拓展开放。
例如中文是姓在前名在后,英文则反之。
下面的例子在不修改原有XiaoMing类时拓展了其功能。
public interface Person{
String getName()
}
public class XiaoMing implements Person{
public String getName(){
return "小明";
}
}
public class MingXiao extends XiaoMing{
public String getEnglishName(){
return "明小";
}
}
依赖倒置原则
高层模块不应该依赖低层模块,两者都应该依赖其抽象。
抽象不应该依赖细节,细节应该依赖抽象。
public class XiaoMing{
//这样不好 如果日后要学其他课程就要修改XiaoMing类
public void studyEnglish(){
//studyEnglish
}
}
修改后
public interface Course{
void study();
}
public class EnglishCourse implements Course{
public void study(){
//studyEnglish
}
}
public class MathCourse implements Course{
public void study(){
//studyMath
}
}
public class XiaoMing{
//这样不好 如果日后要学其他课程就要修改XiaoMing类
public void study(Course course){
//可以学习任意课程 而不用修改XiaoMing类
course.study();
}
}
单一职责原则
不要存在多于一个导致类修改的原因。
每个类、方法、接口都应该只有一个职责。避免多个职责相互影响。
接口隔离原则
类不应该依赖它不需要的接口。
应该设计多个专用的接口,而不是单一的总接口。
迪米特原则(最少知道)
一个对象应该对其他对象保持最少的了解。
不应该引入其可以不使用的成员。如果有“人”帮我统计账单,我只需要账单统计项那么我不应该引入账单,可由统计者汇报。
里氏替换原则
子类可拓展父类的功能但不能修改父类功能。
在任何引用其父类的地方都应该能替换成子类并保证逻辑不变。
- 子类可以有自己特有方法
- 子类不应该覆盖(重写)父类的非抽象方法。
- 子类重载父类方法时入参应该更加宽泛,出参应该更加严格。
里氏替换原则我理解的也不是很好,但觉得是有用的,先遵循再在实践中检验。
合成复用原则
组合、聚合有限继承。
优先使用组合、聚合能够降低类之间的耦合度,降低类的使用难度。组合、聚合的关系是拿来就用不关心实现细节,继承则需要考虑父类功能的影响。