likes
comments
collection
share

设计模式Java实现-状态模式

作者站长头像
站长
· 阅读数 60

✨这里是第七人格的博客✨小七,欢迎您的到来~✨

🍅系列专栏:设计模式🍅

✈️本篇内容: 状态模式✈️

🍱 本篇收录完整代码地址:gitee.com/diqirenge/d… 🍱

楔子

小七以前做过一段时间的APP后台支持开发,当时就发现代码里有对用户登录或者不登陆,做了不同的逻辑判断,而且大多数都是用的if-else大法,现在想起来这种判断其实是可以使用状态模式来实现的。

需求背景

对于一个网站或者APP来说,用户登录或者不登陆能够看到的东西一般是不同的,我们这里要求使用状态模式来实现这个功能。

分析设计

状态模式在Java中实现时,通常会定义一个状态接口,然后为每个具体的状态创建一个实现类。

根据需求,我们可以定义一个“用户状态”接口,以及“登录”和“未登录”两种状态的实现。接下来,我们将创建一个“用户”类,该类持有当前的用户状态,并根据状态来展示不同的内容。

UML图

根据分析设计,我们可以先画一个简单的UML图,后面通过UML图编码

设计模式Java实现-状态模式

模块名称

state

模块地址

gitee.com/diqirenge/d…

模块描述

状态模式代码示例

代码实现

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、测试结果

用户未登录,显示登录页面或公共内容...

用户已登录,显示个人主页内容...

用户未登录,显示登录页面或公共内容...

实现要点

  1. 定义状态接口或抽象类,其中包含处理请求的方法。
  2. 为每个可能的状态创建一个具体的状态类,实现状态接口或继承抽象类,并定义该状态下处理请求的逻辑。
  3. 在上下文类中维护一个当前状态的引用,并提供一个设置状态的方法。上下文类还需要提供一个处理请求的方法,该方法将请求委托给当前状态对象来处理。
  4. 当需要改变状态时,调用上下文类的设置状态方法,传入新的状态对象。

总结

状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。

转载自:https://juejin.cn/post/7380730718295834634
评论
请登录