状态模式

本文通过一个具体实例,展示了如何使用状态模式来替代复杂的if-else和switch逻辑,特别是在处理登录状态下不同用户操作时的行为变化。通过定义一系列的状态接口和具体状态类,实现了根据不同状态调用相应方法的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当行为取决于状态时可以使用状态模式,比如和登录相关的进入收藏,购物车,发起评论之类的按钮。可用于解决if-else和switch逻辑。

状态模式更偏向于状态引起的一些行为的改变。策略模更偏向于使用不同的算法来实现一个功能。

public interface UserState {
    /**
     * 购物车
     */
    public void shoppingCart();
    /**
     * 评论
     */
    public void comment();
}
public class LoginedState implements UserState{
    @Override
    public void shoppingCart() {
        System.out.println("打开购物车");
    }

    @Override
    public void comment() {
        System.out.println("评论");
    }
}
public class LogoutState implements UserState{
    @Override
    public void shoppingCart() {
        System.out.println("请先登录");
    }

    @Override
    public void comment() {
        System.out.println("请先登录");
    }
}
public class LoginContext {
    /**
     * 用户状态,默认未登录
     */
    UserState userState = new LoginedState();

    /**
     * 单例
     */
    private volatile static LoginContext loginContext = null;

    private LoginContext() {
    }

    public static LoginContext getInstance() {
        if (loginContext == null) {
            synchronized (LoginContext.class) {
                if (loginContext == null) {
                    loginContext = new LoginContext();
                }
            }
        }
        return loginContext;
    }

    public void setUserState(UserState userState){
        this.userState = userState;
    }

    public void shoppingCart(){
        userState.shoppingCart();
    }

    public void comment(){
        userState.comment();
    }
}

测试:

        LoginContext.getInstance().shoppingCart();
        LoginContext.getInstance().comment();

        LoginContext.getInstance().setUserState(new LogoutState());
        LoginContext.getInstance().shoppingCart();
        LoginContext.getInstance().comment();

输出:

System.out: 打开购物车

System.out: 评论

System.out: 请先登录

System.out: 请先登录

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值