1.单一职责原则
简单点说就是一个方法、接口只要自己的单一职责就行了
2.里氏替换原则
2.1 所有引用基类的地方必须能透明地使用其子类的对象。
//比如有个抽象类,AbstractGun,有方法shoot()
//它的子类有 AK47,HandGun
//当我们实例化一个AbstractGun的时候,
AbstractGun gun = new HandGun();
AbstractGun.shoot();
//所有父类出现的地方都可以换成子类,并不会出现Bug
2.2 覆盖或实现父类的方法时输入参数可以被放大
public class Father {
public Collection doSomething(HashMap map){
System.out.println("父类被执行...");
return map.values();
}
}
public class Son extends Father {
//放大输入参数类型,注意,这里是重载(Overload),不是重写(Override)父类方法
//也就说子类仍然有 父类的 public Collection doSomething(HashMap map) 方法
public Collection doSomething(Map map){
System.out.println("子类被执行...");
return map.values();
}
}
//使用场景
public class Client {
public static void invoker(){
//父类存在的地方,子类就应该能够存在
Father f = new Father();//Son f = new Son() //换成这句,执行结果是一样的
HashMap map = new HashMap();
f.doSomething(map);
}
public static void main(String[] args) {
invoker();
}
}
//但是如果父类的方法的入参是 Map,子类的方法是 HashMap,那么执行上述代码的时候,将会执行子类的HashMap方法,导致执行结果不一样。
3.依赖倒置原则(面向接口编程)
3.1 高层模块不应该依赖低层模块,两者都应该依赖其抽象
3.2 抽象不应该依赖细节
3.3 细节应该依赖抽象
例如,有一个项目,有用户服务,和电影服务,每个服务都有 Api 和 Server
那么依赖关系应该是:
accountServer 依赖 accountApi
movieServer 依赖 movieApi 和 accountApi
4.接口隔离原则
建立单一接口,不要建立臃肿庞大的接口。再通俗一点讲:接口尽量细化,同时接口中的方法尽量少。客户端不应该依赖它不需要的接口
5.迪米特法则
5.1 一个类只和自己的朋友交流(成员变量、方法的出入参称为朋友,但是方法内部的不是,也就是说,一个类的方法内部应该只调用和它朋友相关的方法,除了JDK的API和一些工具类)
5.2 朋友之间也是有距离的(不应该暴露过多的public方法,然后让朋友去在一个业务逻辑里面调用,应该自己封装一个业务逻辑的public方法,同时把原来的public 改成 private,让朋友直接调用这一个业务方法,同时并不关心内部的实现逻辑)
5.3 如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中。
6.开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。