状态模式是在一个对象的内部状态改变的时候改变其行为。
比如在登录系统的时候,若登录密码错误三次,则锁定该账号。那么在前三次登录的时候,如果密码都错误,系统提示用户“账号或密码错误,请重试!”,要是超过三此密码错误,则锁定账号,提示用户“账号某某已被锁定!”。这里每一个状态都是不同对象的行为。
抽象状态角色:
public abstract class State {
public abstract void login(String username, String password);
}
账号可用状态:
public class AvaliableCount extends State {
public int count;
@Override
public void login(String username, String password) {
if("admin".equals(username) && "123".equals(password)) {
System.out.println("登录成功!");
} else {
System.out.println("账号或密码错误,请重试!");
}
}
}
账号被锁定状态:
public class LockCount extends State {
@Override
public void login(String username, String password) {
System.out.println("账号" + username + "已被锁定!");
}
}
环境角色,用于控制应该让哪个状态实例表现出行为:
public class Login {
public State state;
public Map<String, Integer> loginList = new HashMap<String, Integer>();
static {
}
public void login(String username, String password) {
Integer count = loginList.get(username);
int n = count == null ? 0 : count.intValue();
if(n <= 2) {
new AvaliableCount().login(username, password);
} else {
new LockCount().login(username, password);
}
loginList.put(username, ++ n);
}
}
用户登录系统:
public class Main {
public static void main(String[] args) {
Login login = new Login();
login.login("admin", "11");
login.login("admin", "11");
login.login("admin", "11");
login.login("admin", "11");
}
}
输出:
账号或密码错误,请重试!
账号或密码错误,请重试!
账号或密码错误,请重试!
账号admin已被锁定!