返回介绍

状态模式

发布于 2025-04-20 22:01:09 字数 1952 浏览 0 评论 0 收藏

update: 2017-10-19

废话我就不说了,我们说一个简单的例子。商品库存中心有个最基本的需求是减库存和补库存,我们看看怎么用状态模式来写。

核心在于,我们的关注点不再是 Context 是该进行哪种操作,而是关注在这个 Context 会有哪些操作。

定义状态接口:

public interface State {
    public void doAction(Context context);
}

定义减库存的状态:

public class DeductState implements State {

    public void doAction(Context context) {
        System.out.println("商品卖出,准备减库存");
        context.setState(this);

        //... 执行减库存的具体操作
    }

    public String toString() {
        return "Deduct State";
    }
} 

定义补库存状态:

public class RevertState implements State {
  
    public void doAction(Context context) {
        System.out.println("给此商品补库存");
        context.setState(this);

        //... 执行加库存的具体操作
    }

    public String toString() {
        return "Revert State";
    }
}

前面用到了 context.setState(this),我们来看看怎么定义 Context 类:

public class Context {
    private State state;
  	private String name;
  	public Context(String name) {
        this.name = name;
    }
    
  	public void setState(State state) {
        this.state = state;
    }
  	public void getState() {
        return this.state;
    }
}

我们来看下客户端调用,大家就一清二楚了:

public static void main(String[] args) {
    // 我们需要操作的是 iPhone X
    Context context = new Context("iPhone X");
  	
    // 看看怎么进行补库存操作
  	State revertState = new RevertState();
  	revertState.doAction(context);
  
    // 同样的,减库存操作也非常简单
  	State deductState = new DeductState();
  	deductState.doAction(context);
  
  	// 如果需要我们可以获取当前的状态
    // context.getState().toString();
}

读者可能会发现,在上面这个例子中,如果我们不关心当前 context 处于什么状态,那么 Context 就可以不用维护 state 属性了,那样代码会简单很多。

不过,商品库存这个例子毕竟只是个例,我们还有很多实例是需要知道当前 context 处于什么状态的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。