定义:当一个对象的内在状态发生改变时,允许改变其行为。
其UML图如下:
Context:环境类,定义客户感兴趣的接口,维护一个State子类的实例,这个实例定义了对象的当前状态。
State:抽象状态类或接口,定义一个或一组接口,表示该状态下的行为;
ConstreteStateA与ConstreteStateB:具体状态类,实现了抽象状态类的接口,从而达到了不同状态下的不同行为。
已登录为例:
UserState为表示状态接口
public interface UserState {
void forword(Context context);
void comment(Context context);
}
LoginUserState为实现了UserState接口的具体状态类,表示已经登录
public class LoginUserState implements UserState {
@Override
public void forword(Context context) {
Toast.makeText(context, "转发微博", Toast.LENGTH_SHORT).show();
}
@Override
public void comment(Context context) {
Toast.makeText(context, "评论微博", Toast.LENGTH_SHORT).show();
}
}
LogoutUserState具体接口,表示未登录
public class LogoutUserState implements UserState {
@Override
public void forword(Context context) {
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);
}
}
维护一个State状态的实例,采用单例模式
public class LoginContext {
private UserState mState = new LogoutUserState();
private LoginContext(){}
public void setUserState(UserState userState) {
this.mState = userState;
}
private static LoginContext mInstance = new LoginContext();
public static LoginContext getLoginContext(){
return mInstance;
}
public void forword(Context context){
mState.forword(context);
}
public void comment(Context context){
mState.comment(context);
}
}
调用层根据是登录状态来实现不同行为;
public class MainActivity extends AppCompatActivity {
private Button transmit;
private Button logout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
transmit = findViewById(R.id.transmit);
logout = findViewById(R.id.logout);
//根据是否已经登录跳转到相应的界面
transmit.setOnClickListener( v -> {
LoginContext.getLoginContext().forword(this);
});
//退出登录
logout.setOnClickListener(v -> {
LoginContext.getLoginContext().setUserState(new LogoutUserState());
});
}
}
状态模式关键点是在不同状态下,对于同一行为有不同响应,将if-else用多态实现的具体实例。