设计模式-状态模式
1. 状态模式介绍
状态模式定义:
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式是一种对象行为型模式。
状态模式的使用场景:
(1)对象的行为依赖于它的状态,并且可以在运行时根据状态改变行为。
(2)代码中包含大量与对象状态有关的if/else语句,这些条件对应于对象的各种状态,这些冗余条件语句的出现导致代码的可维护性和灵活性变差,这种情况适合使用状态模式进行优化。
状态模式角色介绍:
(1)Context类,定义客户端所感兴趣的接口,并且内部维护一个具体状态类的实例,从而维护了对象的现有状态。
(2)State:抽象状态类或状态接口,用以抽象封装行为。
(3)ConcreteState类:具体状态类,实现了State中的抽象方法。
使用状态模式解决问题
3.1 State接口类
public interface State{
public void collect (Context context);
}
3.2 State接口实现类:
public class LogInState implements State {
@override
public void collect (Context context){
Toast.makeText(context,"收藏成功",Toast.LENGTH_LONG).show();
}
}
public class LogOutState implements State {
@override
public void collect (Context context){
context.startActivity(new Intent(context,LogInActivity.class));
}
}
3.3 Context类
public class LogInContext{
State mState = new LogOutState();//初始化为未登录状态
static LogInContext mLogInContext = new LogInContext();
private LogInContext(){}
//使用单例模式提供管理类实例
public static LogInContext getLogInContextInstance(){
return mLogInContext;
}
public void collect (Context context){
mState.collect(context);
}
public void setState (State state){
this.mState = state;
}
}
3.4 使用时
//用户在MainActivity点击收藏按钮
LogInContext.getLogInContextInstance.collect(MainActivity.this);
//注销账户
LogInContext.getLogInContextInstance.setState(new LogOutState());
//登录界面LogInActivity
if(登录验证成功){
LogInContext.getLogInContextInstance.setState(new LogInState());
finish();
}
状态模式的优缺点
状态模式的优点:
在不同状态需要有不同响应的使用场景下,避免了使用if/else导致代码臃肿,使代码结构清晰的同时保证了拓展性和维护性。
状态模式的缺点:
状态模式的使用必然会增加类和对象的个数,如果使用不当将导致程序结构和代码的混乱。
网友评论