六大原则
单一职责原则(SRP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、接口隔离原则(ISP)、迪米特法则(LOD)、开闭原则(OCP)
单一职责原则(SRP)
全称:Single Responsibility Principle
目的:提高代码的可维护性、可读性、扩展性,减轻耦合
使用:接口和方法必须保持单一原则,类不做要求,不需要通过判断去使用某种方法或者继承一个接口时某些方法不用导致不重写
enum OprType {
UPDATE_PASSWORD,
UPDATE_NAME;
}
interface UserOpr {boolean updateUserInfo(User user, OprType oprType);
boolean delectUserInfo(User user);
}
class UserOprImpl implements UserOpr {
@Override
public boolean updateUserInfo(User user, OprType oprType) {if (oprType == OprType.UPDATE_NAME) {updareName();
} else if (oprType == OprType.UPDATE_PASSWORD) {updatePassword();
}
return true;
}
@Override
boolean delectUserInfo(User user){
// 不处理
return null;
}
}
上方的代码,用过枚举判断 OprType 来判断调用什么方法,当枚举越来越多时,代码有点多,传参也容易错;同时,继承 UserOpr 接口时对 delectUserInfo 方法没有重写,这是要避免的,这两点都不符合单一职责原则,正确代码:
interface UserOpr1 {boolean updatePassword(User user, String password);
}
interface UserOpr2 {boolean updateUserInfo(User user);
}
interface UserOpr3 {boolean delectUserInfo(User user);
}
// 需要什么就继承什么
class UserOprImpl implements UserOpr1,UserOpr2 {
@Override
public boolean updatePassword(User user, String password) {user.setPassword(password);
// update password
return true;
}
@Override
public boolean updateUserInfo(User user) {
// update user info
return true;
}
}
以上一个接口一个方法,需要什么便去继承并重写便可
里氏替换原则(LSP)
全称:Liskov Substitution Principle
优点:
- 代码共享,减少创建类的工作量;
- 提高代码的重用性;
- 提高代码的可扩展性,实现父类的方法就可以自己定义自己的需求代码了,许多开源框架的扩展接口都是通过继承父类来完成的
使用:接口和方法必须保持单一原则,类不做要求,不需要通过判断去使用某种方法或者继承一个接口时某些方法不用导致不重写
缺点:
- 只要继承,就必须拥有父类的所有属性和方法
- 增加了代码的耦合性,修改父类,需要考虑子类的修改
使用:
不得重写父类的方法,只能继承使用
依赖倒置原则(DIP)
全称:Dependence Inversion Principle
好处:降低类的耦合性,是代码更加灵活,便于处理
接口隔离原则(ISP)
全称:Dependence Inversion Principle
使用:个人感觉和单一原则有点像,继承接口时应使用到接口所有的方法,不应该存在继承接口只使用到某一方法,所以设计接口时应该考虑好
迪米特法则(LOD)
全称:Law of Demeter
优点:高内聚,低耦合
使用:是你的就是你的,别人的就是别人的
例子:设计用手机打开 app 看资讯,手机类中有 app 的类,但是不应该有咨询的类,因为咨询类应该是 app 类才有的
开闭原则(OCP)
全称:Open Closed Principle
使用:可以扩展,但是不可以修改;即是有新的功能,直接扩展出一个新的功能代码逻辑就可以,不需要修其他的代码