*第* *1* *章 单一职责原则*
单一职责原则的英文名称是 Single Responsibility Principle,简称是 SRP
*1)阐述场景*
只要做过项目,肯定要接触到用户、机构、角色管理这些模块,基本上使用的都是
RBAC 模型(Role-Based Access Control,基于角色的访问控制,通过分配和取消角色来完成
用户权限的授予和取消,使动作主体(用户)与资源的行为(权限)分离),确实是一个很
好的解决办法。我们这里要讲的是用户管理、修改用户的信息、增加机构(一个人属于多个
机构)、增加角色等,用户有这么多的信息和行为要维护,我们就把这些写到一个接口中,
都是用户管理类嘛,我们先来看它的类图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FyqZ8Mjd-1611823342619)(file:///C:\Users\16221\AppData\Local\Temp\ksohtml11728\wps1.jpg)]
、
*2)上述设计存在的问题*
用户的属性和用户的行为没有分开
*3)修改之后的设计*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Ef4Zfdm-1611823342624)(file:///C:\Users\16221\AppData\Local\Temp\ksohtml11728\wps2.jpg)]
*4)代码实现*
*1.整体的代码结构*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZVUCn9E-1611823342626)(file:///C:\Users\16221\AppData\Local\Temp\ksohtml11728\wps3.jpg)]
2.最顶层的 IUserInfo
/**
\* 顶层的IUser 接口
*/
public interface IUserInfo extends IUserBiz,IUserBO{
}
3.IUserInfo 两个子接口 IUserBiz,IUserBO
/**
\* 负责用户的行为
*/
public interface IUserBiz{
public boolean changePassword(String password);
}
/**
\* 负责用户的属性
*/
public interface IUserBO {
public void setUserID(String userID);
public String getUserID();
public void setPassword(String password);
public String getPassword();
public void setUserName(String userName);
public String getUserName();
}
4.两个实现类 IUserBizImpl ,IUserBOImpl
/**
\* @Description:
\* @Author 16221
\* @Date 2021/1/28
**/
public class IUserBizImpl implements IUserBiz {
@Override
public boolean changePassword(String password) {
return false;
}
}
/**
\* @Description:
\* @Author 16221
\* @Date 2021/1/28
**/
public class IUserBOImpl implements IUserBO {
@Override
public void setUserID(String userID) {
}
@Override
public String getUserID() {
return null;
}
@Override
public void setPassword(String password) {
}
@Override
public String getPassword() {
return null;
}
@Override
public void setUserName(String userName) {
}
@Override
public String getUserName() {
return null;
}
}
5.测试的场景类 Client
/**
\* @Description:场景类测试
\* @Author 16221
\* @Date 2021/1/28
**/
@Slf4j
public class Client {
public static void main(String[] args) {
//最顶层接口的实现类
IUserInfoImpl userInfo = new IUserInfoImpl();
//维护用户信息
IUserBO userBO = userInfo;
userBO.setUserName("天珩");
userBO.setPassword("123");
log.info("userInfo :{}",userInfo.getPassword());
log.info("userBO :{}",userBO.getPassword());
//维护用户行为
IUserBiz userBiz = userInfo;
userBiz.changePassword("456");
log.info("userInfo :{}",userInfo.getPassword());
log.info("userBO :{}",userBO.getPassword());
}
}
*5)过程中遇到的问题*
l 接口的多继承,被 java 单继承洗脑了,接口是可以多继承的
l 看这个 类图,很久不翻译了,关系搞反了,谁继承谁,谁实现谁的问题
*6)笔者强烈建议手撸一遍代码,会有不同的理解,之前看书,只是浮于表面,手撸一遍代码之后理解更深刻*