返回
从函数迁移到对象:极简优雅的状态模式
Android
2023-10-20 02:49:49
在 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
接口,它定义了所有状态都必须实现的方法。
然后,我们定义了两个具体的状态类,OfflineState
和 LoginState
。这两个类实现了 State
接口的方法。
在 App
类中,我们通过 setState()
方法来切换状态。
当用户点击大叉时,我们调用 clickBigCross()
方法来处理这个事件。clickBigCross()
方法会调用当前状态对象的 clickBigCross()
方法。
这样,我们就用状态模式来实现了状态的切换。代码变得更加简洁易懂,而且当状态数量较多时,代码也不会变得很复杂。