设计模式Java实现-状态模式
✨这里是第七人格的博客✨小七,欢迎您的到来~✨
🍅系列专栏:设计模式🍅
✈️本篇内容: 状态模式✈️
🍱 本篇收录完整代码地址:gitee.com/diqirenge/d… 🍱
楔子
小七以前做过一段时间的APP后台支持开发,当时就发现代码里有对用户登录或者不登陆,做了不同的逻辑判断,而且大多数都是用的if-else大法,现在想起来这种判断其实是可以使用状态模式来实现的。
需求背景
对于一个网站或者APP来说,用户登录或者不登陆能够看到的东西一般是不同的,我们这里要求使用状态模式来实现这个功能。
分析设计
状态模式在Java中实现时,通常会定义一个状态接口,然后为每个具体的状态创建一个实现类。
根据需求,我们可以定义一个“用户状态”接口,以及“登录”和“未登录”两种状态的实现。接下来,我们将创建一个“用户”类,该类持有当前的用户状态,并根据状态来展示不同的内容。
UML图
根据分析设计,我们可以先画一个简单的UML图,后面通过UML图编码
模块名称
state
模块地址
模块描述
状态模式代码示例
代码实现
1、编写【用户状态接口】类
/**
* 用户状态接口
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/12
*/
public interface UserState {
/**
* 根据状态展示不同的内容
*/
void showContent();
/**
* 登录
*/
void login();
/**
* 登出
*/
void logout();
}
2、编写【登录状态实现】类
/**
* 登录状态实现
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/12
*/
public class LoggedInState implements UserState {
private UserContent userContent;
public LoggedInState(UserContent userContent) {
this.userContent = userContent;
}
@Override
public void showContent() {
System.out.println("用户已登录,显示个人主页内容...");
}
@Override
public void login() {
System.out.println("用户已登录,无需重复登录。");
}
@Override
public void logout() {
userContent.setState(new LoggedOutState(userContent));
// 登出后展示未登录内容
userContent.showContent();
}
}
3、编写【未登录状态实现】类
/**
* 未登录状态实现
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/12
*/
public class LoggedOutState implements UserState {
private UserContent userContent;
public LoggedOutState(UserContent userContent) {
this.userContent = userContent;
}
@Override
public void showContent() {
System.out.println("用户未登录,显示登录页面或公共内容...");
}
@Override
public void login() {
userContent.setState(new LoggedInState(userContent));
// 登录后展示登录内容
userContent.showContent();
}
@Override
public void logout() {
System.out.println("用户未登录,无需登出。");
}
}
4、编写【用户上下文】类
/**
* 用户上下文
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/12
*/
public class UserContent {
private UserState state;
public UserContent() {
// 初始化为未登录状态
this.state = new LoggedOutState(this);
}
public void setState(UserState state) {
this.state = state;
}
/**
* 展示当前状态下的内容
*/
public void showContent() {
state.showContent();
}
/**
* 用户登录操作
*/
public void login() {
state.login();
}
/**
* 用户登出操作
*/
public void logout() {
state.logout();
}
}
5、编写测试类
/**
* 状态模式测试类
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/12
*/
public class StateTest {
@Test
public void testState() {
UserContent userContent = new UserContent();
// 显示未登录内容
userContent.showContent();
// 登录操作,展示登录后内容
userContent.login();
// 登出操作,展示未登录内容
userContent.logout();
}
}
6、测试结果
用户未登录,显示登录页面或公共内容...
用户已登录,显示个人主页内容...
用户未登录,显示登录页面或公共内容...
实现要点
- 定义状态接口或抽象类,其中包含处理请求的方法。
- 为每个可能的状态创建一个具体的状态类,实现状态接口或继承抽象类,并定义该状态下处理请求的逻辑。
- 在上下文类中维护一个当前状态的引用,并提供一个设置状态的方法。上下文类还需要提供一个处理请求的方法,该方法将请求委托给当前状态对象来处理。
- 当需要改变状态时,调用上下文类的设置状态方法,传入新的状态对象。
总结
状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。
转载自:https://juejin.cn/post/7380730718295834634