返回

从函数迁移到对象:极简优雅的状态模式

Android

在 UI 开发中,我们经常会遇到界面有多种状态的场景,每一种状态下界面元素对应的操作都不同。例如,在离线状态下点击大叉会直接退出应用,而在登录状态下点击大叉会退出登录。

最简单直观的方案就是用 int 值来保存当前状态,根据 int 值不同会运行不同分支的操作。这种方法虽然简单,但是可读性差,而且当状态数量较多时,代码会变得非常复杂。

为了解决这个问题,我们可以使用状态模式。状态模式是一种设计模式,它将每一种状态抽象成一个独立的对象,然后通过切换不同的状态对象来实现状态的切换。

使用状态模式可以使代码更加简洁易懂。同时,由于每一种状态都是一个独立的对象,因此可以很容易地添加新的状态。

下面我们来看一个使用状态模式的例子:

class App {
  private State state;

  public App() {
    this.state = new OfflineState();
  }

  public void clickBigCross() {
    this.state.clickBigCross(this);
  }

  public void setState(State state) {
    this.state = state;
  }
}

interface State {
  void clickBigCross(App app);
}

class OfflineState implements State {
  @Override
  public void clickBigCross(App app) {
    app.exit();
  }
}

class LoginState implements State {
  @Override
  public void clickBigCross(App app) {
    app.logout();
  }
}

在这个例子中,我们定义了一个 App 类,它是应用程序的入口。App 类有一个 state 属性,它保存当前的状态。

我们还定义了一个 State 接口,它定义了所有状态都必须实现的方法。

然后,我们定义了两个具体的状态类,OfflineStateLoginState。这两个类实现了 State 接口的方法。

App 类中,我们通过 setState() 方法来切换状态。

当用户点击大叉时,我们调用 clickBigCross() 方法来处理这个事件。clickBigCross() 方法会调用当前状态对象的 clickBigCross() 方法。

这样,我们就用状态模式来实现了状态的切换。代码变得更加简洁易懂,而且当状态数量较多时,代码也不会变得很复杂。