/**
* 状态模式: 允许对象在内部状态改变时改变它的行为,对象看起来好羞修改了它的类 (解决大量if else 重复操作)
* 当一个对象的行为取决于它的状态时,并且它必须在运行时刻根据状态改变它的行为时就可以考虑用状态模式
* * 状态模式允许一个对象基于内部状态而拥有不同的行为
* * 和程序状态机不同,状态模式用类代表状态
* * Context会将行为委托给当前状态对象
* * 通过将每个状态封装进一个类,我们把以后需要的任何改变局部化
* * 状态模式允许Context随着状态的改变而改变行为
* * 状态转行可以由State类或Context类控制
* * 使用状态模式通常会导致设计类数目大量增加
* * 状态模式可以被多个Context实例共享
* <p>
* <p>
* 模拟程序:
* 用户登陆页面 ,登陆操作,获取资源,获取角色
* 其实比较类似 责任链模式
*/
public class StatePattern {
public static void main(String args[]) {
Context context = new Context();
// context.Login();
// context.GetRolePermission();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
// context.LoginPage();
context.LoginPage();
context.Login();
context.GetRolePermission();
}
}
class Context {
State loginPageState;
State loginState;
State permissionState;
private State state = loginPageState;
public void setState(State state) {
this.state = state;
}
public State getPermissionState() {
return permissionState;
}
public State getLoginState() {
return loginState;
}
public State getLoginPageState() {
return loginPageState;
}
public Context() {
loginPageState = new LoginPageState(this);
loginState = new LoginState(this);
permissionState = new RolePermissionState(this);
state = loginPageState;
}
public void LoginPage() {
state.LoginPage();
}
public void Login() {
state.UserLogin();
}
public void GetRolePermission() {
state.GetRolePermission();
}
}
class LoginState implements State {
Context context;
public LoginState(Context context) {
this.context = context;
}
@Override
public void GetRolePermission() {
System.out.println("用户为登陆,请先登录");
}
@Override
public void LoginPage() {
System.out.println("用户正在登陆请求");
}
@Override
public void UserLogin() {
System.out.println("正在登陆.........");
context.setState(context.getPermissionState());
}
}
class LoginPageState implements State {
Context context;
public LoginPageState(Context context) {
this.context = context;
}
@Override
public void GetRolePermission() {
System.out.println("用户为登陆,请先登录");
}
@Override
public void LoginPage() {
System.out.println("用户在登陆页面");
context.setState(context.getLoginState());
}
@Override
public void UserLogin() {
System.out.println("只允许在登陆页面提交请求");
}
}
//登陆成功后获取资源
class RolePermissionState implements State {
Context context;
public RolePermissionState(Context context) {
this.context = context;
}
@Override
public void GetRolePermission() {
System.out.println("获取资源完成,用户回到登陆页面");
context.setState(context.getLoginPageState());
}
@Override
public void LoginPage() {
System.out.println("用户已经登陆");
}
@Override
public void UserLogin() {
System.out.println("只允许在登陆页面提交请求");
}
}
interface State {
default void LoginPage() {
System.out.println("用户登陆页面");
}
default void UserLogin() {
System.out.println("用户登陆");
}
default void GetRolePermission() {
System.out.println("用户登陆获取资源");
}
}
近期评论