SRP的意思就是一个类只有一个引起他变化的原因,怎么理解,就是将稳定的部分封装在
一个class里面,变化的部分用接口隔离起来。
public interface IDBAction {
void add();
void delete();
}
public class DBManager implements IDBAction {
@Override
public void add() {
if (isLegalUser()) {
DebugLog.log("add action");
}
}
@Override
public void delete() {
if (isLegalUser()) {
DebugLog.log("delete action");
}
}
private boolean isLegalUser() {
return true;
}
}
从面的case不难想到,因为业务需要,在add/delete之前都需要判断该用户的权限,导致如果isLegalUser的逻辑发生变化,这个包含这个方法的方法
都需要改变,作为一位合格的程序要意识到应该将次变化隔离:
首先添加一个接口:
public interface IUserChecker {
boolean isLegalUser();
}
public class TnUserChecker implements IUserChecker {
@Override
public boolean isLegalUser() {
// TODO Auto-generated method stub
return true;
}
}
将manager重构如下:
public class DBManager implements IDBAction {
private IUserChecker checker;
public void setChecker(IUserChecker checker) {
this.checker = checker;
}
@Override
public void add() {
if (checker.isLegalUser()) {
DebugLog.log("add action");
}
}
@Override
public void delete() {
if (checker.isLegalUser()) {
DebugLog.log("delete action");
}
}
}
这样isLegalUser的变化和DBManager 的关联不是那么密切,有一天如果isLegalUser从数据库
验证变成jndi验证,只需要变相应的实现就可以了。