基于java实现自由切换登录状态功能

举报
运气男孩 发表于 2020/12/31 01:14:24 2020/12/31
【摘要】 日常开发中,登录和未登录两种状态分别有不同的操作,比如登录后才能评论、收藏、支付购买和编辑资料等操作。我们网购时看到心仪的商品,如果处于登录状态,可以加购物车或直接购买,否则会跳转到登录页面,登录后再继续执行先前的动作。这里涉及的状态有两种,即登录和未登录。行为有两种,即加购物车和直接购买。如果使用 if-else 语句实现,代码如下。public void addShopping() { ...

日常开发中,登录和未登录两种状态分别有不同的操作,比如登录后才能评论、收藏、支付购买和编辑资料等操作。我们网购时看到心仪的商品,如果处于登录状态,可以加购物车或直接购买,否则会跳转到登录页面,登录后再继续执行先前的动作。这里涉及的状态有两种,即登录和未登录。行为有两种,即加购物车和直接购买。

如果使用 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("直接购买");
    }
}

运行结果如下所示。

跳转到登录页面!
加购物车成功
直接购买

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。