一、单一职责
一个类或者模块只专注做一件事,应该有且只有一个改变的原因。
强调:类或模块,在开发中灵活运用。比如基本的减加乘除法,四个做到模块单一职责就好,可以封装在一个类里,没有特别大必要各占一个类。
二、接口隔离
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
A类通过接口使用B中的123方法,C类通过接口使用D中的145方法。
不符合接口隔离原则的接口设计:
符合接口隔离原则的接口设计:
三、依赖倒转
高层模块不应该依赖低层模块,二者都应该依赖其抽象
细节依赖抽象,而不是抽象依赖细节
中心思想是:面向接口编程
public class DependecyInversion {
public static void main(String[] args) {
Person person = new Person();
person.receive(new Email());
person.receive(new Phone());
}
}
class Email implements info{
public String getInfo(){
return"电子邮件信息:hello,world";
}
}
class Phone implements info{
public String getInfo(){
return"电话信息:hello,world";
}
}
interface info{
String getInfo();
}
class Person{
public void receive(info i){
System.out.println(i.getInfo());
}
}
四、里氏替换
所有引用基类的地方必须能透明地使用其子类的对象
子类尽量不重写父类方法
回忆一下C++的赋值兼容规则:在任务需要基类对象的地方都可以用该基类的共有派生类的对象来代替。
//不符合里氏替换原则
class A{
public int func1(int num1,int num2){
return num1-num2 ;
}
}
class B extends A{
public int func1(int a,int b){
return a+b;
}
}
//符合里氏替换原则
class A{
public int func1(int num1,int num2){
return num1-num2 ;}
}
class B extends A{
public int func2(int a,int b){
return func1(a,b);
}
}
五、开闭原则
对修改关闭,对扩展 开放
六、迪米特法则
又叫最少知道原则,即一个类对自己依赖的类知道的越少越好,也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部,对外除了提供的public方法,不对外泄露任何信息。
简单定义:只与直接朋友通信(直接朋友:出现在成员变量,方法参数,方法返回值中的类为直接朋友。)
也就是,陌生的类最好不要以局部变量的形式出现在类的内部。
七、合成复用原则
尽量使用合成/聚合的方式,而不是使用继承。
这些原则都是前人在开发过程中遇到的绝大多数坑的解决办法,不绝对的全,也不绝对的适用所有的情况,还需在实践中业务和原则协调,祝愿大家都能写出高性能、高并发、高可用、易扩展、易读、可演化……的代码