使用责任链模式实现热插拔权限控制
为了让小伙伴们加深对责任链模式的理解,本节我们使用责任链模式实现热插拔权限控制。
首先创建实体类 Member。
下面我们使用责任链模式来优化代码,首先创建一个 Handler 类。
首先创建实体类 Member。
public class Member { private String username; private String password; private String roleName; public Member(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } @Override public String toString() { return "Member{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", roleName='" + roleName + '\'' + '}'; } }下面再来看一段我们经常使用的代码。
import org.springframework.util.StringUtils; public class MemberService { public void login(String userName, String password) { if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)) { System.out.println("用户名和密码为空"); return; } System.out.println("用户名和密码不为空,可以向下执行"); System.out.println("用户名:" + userName + ",密码:" + password); Member member = checkExist(userName, password); if (null == member) { System.out.println("用户不存在"); return; } System.out.println("登录成功!"); if (!"管理员".equals(member.getRoleName())) { System.out.println("您不是管理员,没有该操作权限"); return; } System.out.println("允许操作"); } private Member checkExist(String userName, String password) { Member member = new Member(userName, password); member.setRoleName("管理员"); return member; } public static void main(String[] args) { MemberService service = new MemberService(); service.login("新宝库", "https://www.xinbaoku.com"); } }运行结果如下:
用户名和密码不为空,可以向下执行
用户名:新宝库,密码:https://www.xinbaoku.com
登录成功!
允许操作
下面我们使用责任链模式来优化代码,首先创建一个 Handler 类。
public abstract class Handler { protected Handler chain; public void next(Handler handler) { this.chain = handler; } public abstract void doHandler(Member member); }然后分别创建非空校验 ValidateHandler 类、登录校验 LoginHandler 类和权限校验 AuthHandler 类。ValidateHandler 类的代码如下。
public class ValidateHandler extends Handler { public void doHandler(Member member) { if (StringUtils.isEmpty(member.getUsername()) || StringUtils.isEmpty(member.getPassword())) { System.out.println("用户名和密码为空"); return; } System.out.println("用户名和密码不为空,可以往下执行"); System.out.println("用户名:" + member.getUsername() + ",密码:" + member.getPassword()); chain.doHandler(member); } }LoginHandler 类的代码如下。
public class LoginHandler extends Handler { public void doHandler(Member member) { System.out.println("登录成功!"); member.setRoleName("管理员"); chain.doHandler(member); } }AuthHandler 类的代码如下。
public class AuthHandler extends Handler { public void doHandler(Member member) { if (!"管理员".equals(member.getRoleName())) { System.out.println("您不是管理员,没有操作权限"); return; } System.out.println("您是管理员,允许操作"); } }接着修改 MemberService 中的代码,将前面定义好的几个 Handler 根据业务需求串联起来,形成一条链即可。
public class MemberService { public void login(String userName, String password) { Handler validateHandler = new ValidateHandler(); Handler loginHandler = new LoginHandler(); Handler authHandler = new AuthHandler(); validateHandler.next(loginHandler); loginHandler.next(authHandler); validateHandler.doHandler(new Member(userName, password)); } }客户端测试代码如下。
public static void main(String[] args) { MemberService service = new MemberService(); service.login("新宝库", "https://www.xinbaoku.com"); }运行结果如下所示。
用户名和密码不为空,可以往下执行
用户名:新宝库,密码:https://www.xinbaoku.com
登录成功!
您是管理员,允许操作
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算