状态模式主要用于多个地方根据某个字段状态进行后续的不同操作,比如:收藏功能,如果是未登录则跳转到登录页面,如果已登录,收藏成功
1、定义状态不同进行不同的操作接口
public interface UserState {
/*
定义用户登录、退出后两种状态 评论和跳转的不同转向
*/
void forward(Context context, Intent intent);
void comment(Context context);
}
2、登录成功后的操作
public class LoginedState implements UserState {
@Override
public void forward(Context context,Intent intent) {
context.startActivity(intent);
}
@Override
public void comment(Context context) {
Toast.makeText(context,"跳转到评论区",Toast.LENGTH_SHORT).show();
}
}
3、未登录的操作
public class LogoutState implements UserState {
@Override
public void forward(Context context, Intent intent) {
goToLoginActivity(context);
}
@Override
public void comment(Context context) {
goToLoginActivity(context);
}
//涉及未登录全部跳转到登录页面
private void goToLoginActivity(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
}
4、定义操作登录和未登录的单例入口
public class LoginContext {
private LoginContext() {
}
private static LoginContext mLoginContext;
public static LoginContext getInstance() {
if (mLoginContext == null) {
synchronized (LoginContext.class) {
if (mLoginContext == null) {
mLoginContext = new LoginContext();
}
}
}
return mLoginContext;
}
private UserState mUserState;
public void setUserState(UserState state) {
mUserState = state;
}
//策略设计模式,根据是否登录实现不同的策略,依赖注入
private void checkLogin(){
String token = PreferenceUtil.getInstance().getToken("token");
if (null != token) {
//已登录
// mUserState = new LoginedState();
setUserState(new LoginedState());
} else {
//未登录
// mUserState = new LogoutState();
setUserState(new LogoutState());
}
}
public void forward(Context context, Intent intent){
checkLogin();
mUserState.forward(context,intent);
}
public void comment(Context context){
checkLogin();
mUserState.comment(context);
}
}
5、验证
//如果登录了,跳转到MainActivity类,如果没有登录,则跳转到登录页面
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("key","你好,真不错呢啊");
LoginContext.getInstance().forward(this,intent);
//如果登录了,则提示评论,如果未登录,则跳转到登录页面
LoginContext.getInstance().comment(this);