状态模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,将容易产生问题的if语句删除,以方便日后的维护,同时也让每一个状态对修改关闭,让含有状态的类对扩展开放。
状态模式
定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
UML图
- 内容:内部持有某些状态接口,并维护着对象的现有状态
- 状态接口:抽象状态类或者接口,用以封装行为
- 具体状态:具体状态类,实现了状态接口中的方法
例子
以登录场景为例,我们知道如果想发送微博或者在他人微博下方留言,那么服务器会检查我们是否已经登录,即是否符合这个状态,如果符合的话,则会进行后续的业务逻辑处理。
那我们通常会怎么做呢?
if(已经登录){
//发表微博
}else{
//请登录
}
if语句的处理会给日后代码的扩展造成不良的影响,不方便维护,状态模式则是解决这个问题的好手。
state接口
package state;
public interface State {
void validation();
}
state接口实现类
package state;
public class LoginState implements State {
Context context;
public LoginState(Context context) {
this.context = context;
}
@Override
public void validation() {
System.out.println("I'm loggin");
}
}
package state;
public class LogoutState implements State {
Context context;
public LogoutState(Context context) {
this.context = context;
}
@Override
public void validation() {
System.out.println("I'm loggout");
}
}
Context
package state;
public class Context {
LoginState loginState;
LogoutState logoutState;
State state;
public void setState(State state) {
this.state = state;
}
public void validation(){
state.validation();
}
}
小结
状态模式的使用很好的避免了if/else语句给代码维护带来的问题,但是同时也会使得类和对象增多。
状态模式和策略模式是双胞胎,但是策略模式是使用算法族的组合来实现程序的解耦和可扩展性,而状态模式则依靠对象内部状态的行为来控制自身行为。前者的算法组是可以互相代替的,而后者的状态决定了行为,因此无法相互代替。
源码在这里:我的github地址