状态模式顾名思义,根据不同的状态进行不同的操作
public class LoginOperation {
private static final int LOGINON = 1;
private static final int LOGINOFF = 2;
private int state = 2;
public void LooKPerson() {
if (state == 1) {
System.out.println("你看了");
} else {
System.out.println("没登录不能看");
}
}
public void ChatPerson() {
if (state == 1) {
System.out.println("你可以聊天");
} else {
System.out.println("没登录不能看");
}
}
public void LookNews() {
if (state == 1) {
System.out.println("你可以看");
} else {
System.out.println("没登录不能看");
}
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
这是一个登陆的类对于登陆的状态是有不同的操作,你没次多一个方法,可能会不断的进行ifelse 的这种操作
状态模式是讲状态这个类进行抽象
public interface LoginState {
abstract void LooKPerson();
abstract void ChatPerson();
abstract void LookNews();
}
对于登陆状态有三个方法,对于不同的状态可以不同的操作
public class LoginOnState implements LoginState{
@Override
public void ChatPerson() {
// TODO Auto-generated method stub
System.out.println("你能聊天");
}
@Override
public void LooKPerson() {
// TODO Auto-generated method stub
System.out.println("你能看人");
}
@Override
public void LookNews() {
// TODO Auto-generated method stub
System.out.println("你能看新聞");
}
}
public class MyLoginOperation{
LoginState state;
public void ChatPerson() {
state.ChatPerson();
}
public void LooKPerson() {
state.LooKPerson();
}
public void LookNews() {
state.LookNews();
}
public void setState(LoginState state){
this.state=state;
}
}
总结
优点:将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
缺点:状态的模式使用必然增加系统的类和对象,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态(Android的WiFi的切换源码中有各负责状态转换的类,并不能进行随意的转换,如坐电梯,你不能再电梯升降的情况下做打开的操作这是其中两个状态);而且修改某个状态类的行为也需修改对应类的源代码。