假设有一个用户管理系统,需要判断当前用户是否已经登录。
使用状态模式
通过不同状态去执行不同逻辑。
首先定义一个状态接口LoginState,并在接口中定义了两个方法:
public interface LoginState {
void handle();
String getStateName();
}
其中handle()方法表示处理该状态的方法,getStateName()方法返回该状态的名称。然后定义两个具体状态类:LoggedInState和LoggedOutState。
public class LoggedInState implements LoginState {
@Override
public void handle() {
System.out.println("当前用户已登录");
}
@Override
public String getStateName() {
return "已登录";
}
}
public class LoggedOutState implements LoginState {
@Override
public void handle() {
System.out.println("当前用户未登录");
}
@Override
public String getStateName() {
return "未登录";
}
}
接下来定义一个用户类User,用于保存当前用户的状态,并提供一个方法getUserState()用于获取当前用户的状态。
public class User {
private LoginState state;
public User(LoginState state) {
this.state = state;
}
public void setState(LoginState state) {
this.state = state;
}
public LoginState getUserState() {
return state;
}
}
最后,在客户端代码中,可以根据当前用户的状态来执行不同的操作:
public static void main(String[] args) {
User user = new User(new LoggedOutState()); // 初始状态为未登录
// 根据当前用户状态执行不同的操作
user.getUserState().handle();
}
运行上述代码,输出结果如下:
当前用户未登录
如果将User对象的状态改为已登录,再次运行代码,输出结果如下:
当前用户已登录
通过使用状态模式,我们可以将原本大量的if-else语句转换成不同的状态类,从而使得代码更加清晰易懂、易维护。
不使用状态模式
如果不使用状态模式,我们可能会在代码中使用很多的if-else语句来判断当前用户的状态。例如,在用户管理系统中,可能会有很多个地方需要根据当前用户是否已登录来执行不同的逻辑,这时候就会写出很多类似下面这样的代码:
User user = getCurrentUser();
if (user != null && user.isLoggedIn()) {
// 执行已登录用户的操作
} else {
// 执行未登录用户的操作
}
这样的代码虽然简单,但是如果在多处都要进行状态判断,就会导致代码冗余度很高、可读性差、扩展性也不好。
而使用状态模式,我们可以将状态的处理逻辑封装到不同的状态类中,从而避免了大量的if-else语句。此外,状态模式还可以让我们添加新的状态变得更加容易,只需要添加一个新的具体状态类即可。因此,使用状态模式来处理对象的状态会使我们的代码更加清晰、灵活、易于维护和扩展。