使用状态模式自由切换登录状态
日常开发中,登录和未登录两种状态分别有不同的操作,比如登录后才能评论、收藏、支付购买和编辑资料等操作。我们网购时看到心仪的商品,如果处于登录状态,可以加购物车或直接购买,否则会跳转到登录页面,登录后再继续执行先前的动作。这里涉及的状态有两种,即登录和未登录。行为有两种,即加购物车和直接购买。
如果使用 if-else 语句实现,代码如下。
下面使用状态模式来实现这个逻辑,代码如下。
首先创建抽象状态角色 UserState 类,用来定义不同状态下需要执行的方法。
如果使用 if-else 语句实现,代码如下。
public void addShopping() { if(未登录){ System.out.println("去登录"); return; } System.out.println("加入购物车!"); } public void buy(){ if(未登录){ System.out.println("去登录"); return; } System.out.println("直接购买!"); }以上代码是比较常用的,可以看出每个操作都需要判断用户是否处于登录状态。简单的情况下这样做没什么问题,也省去了状态类,但是如果这是一个庞大的系统。那就有必要斟酌是否使用状态模式了。
下面使用状态模式来实现这个逻辑,代码如下。
首先创建抽象状态角色 UserState 类,用来定义不同状态下需要执行的方法。
public abstract class UserState { public AppContext getContext() { return context; } protected AppContext context; public void setContext(AppContext context) { this.context = context; } public abstract void addShopping(); public abstract void buy(String buy); }然后创建登录状态 LoginState 类。
package state; public class LoginState extends UserState { @Override public void addShopping() { System.out.println("加购物车成功"); } @Override public void buy(String buy) { System.out.println(buy); } }创建未登录状态 UnLoginState 类。
package state; public class UnLoginState extends UserState { @Override public void addShopping() { this.jumpLogin(); this.context.getState().addShopping(); } @Override public void buy(String buy) { this.jumpLogin(); this.context.getState().buy(buy); } private void jumpLogin() { System.out.println("跳转到登录页面!"); this.context.setState(this.context.STATE_LOGIN); } }创建上下文角色 AppContext 类,此类负责操作状态,并且实现了调用类需要用到的方法。
package state; public class AppContext { public static final UserState STATE_LOGIN = new LoginState(); public static final UserState STATE_UNLOGIN = new UnLoginState(); private UserState currentState = STATE_UNLOGIN; { STATE_LOGIN.setContext(this); STATE_UNLOGIN.setContext(this); } public void setState(UserState state) { this.currentState = state; } public UserState getState() { return this.currentState; } public void addShopping() { this.currentState.addShopping(); } public void buy(String buy) { this.currentState.buy(buy); } }最后编写客户端测试代码如下。
public class Test { public static void main(String[] args) { AppContext context = new AppContext(); context.addShopping(); context.buy("直接购买"); } }运行结果如下所示。
跳转到登录页面!
加购物车成功
直接购买
所有教程
- 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
- 大数据
- 云计算