设计模式专栏
1.定义:
当一个对象的内在状态发生改变时允许改变其行为,这个对象看起来改变了其类
2.描述:
状态模式中行为是由状态决定的,不同的状态有不同的行为,状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
3.应用场景
一个对象是有状态的
这个对象在不同的状态时,行为不一样
状态可以切换
4.UML建模图
Context :环境类,定义客户兴趣的接口,维护了一个State子类的实例,这个实例定义了对象的当前状态
State :抽象状态类或者状态接口,定义一个或者一组接口,表示该状态下的行为
ConcreteStateA 、ConcreteStateB:具体状态类,每一个具体的状态类实现State中定义的接口,从而实现达到不同状态的不同行为。
5.简单示例:
以抖音转发和评论功能作为示例
当用户评论或者转发的时候需要验证用户登录状态,若是登录状态,则可以直接进行评论和转发,若没有登录,则跳转到登录页面
/**
* 用户行为
*/
public interface UserState {
/**
* 评论功能
*/
void commont();
/**
* 转发功能
*/
void forward();
}
/**
* 登录状态行为
*/
public class LoginState implements UserState {
@Override
public void commont() {
System.out.println("评论成功!");
}
@Override
public void forward() {
System.out.println("转发成功!");
}
}
/**
* 注销状态行为
*/
public class LogOutState implements UserState {
@Override
public void commont() {
System.out.println("不能评论,没有登录,跳到登录页面");
}
@Override
public void forward() {
System.out.println("不能转发,没有登录,跳到登录页面");
}
}
状态持有
public class LoginContext implements UserState {
UserState mState=new LogOutState();
static LoginContext sLoginContext=new LoginContext();
public static LoginContext getInstance(){
return sLoginContext;
}
public void setState(UserState state){
if (state instanceof LoginContext) {
System.out.println("切换登录状态");
}else{
System.out.println("切换注销状态");
}
mState=state;
}
@Override
public void commont() {
mState.commont();
}
@Override
public void forward() {
mState.forward();
}
}
public class Test {
public static void main(String[] args){
LoginContext.getInstance().commont();
//登录成功
LoginContext.getInstance().setState(new LoginState());
LoginContext.getInstance().commont();
LoginContext.getInstance().forward();
//注销成功
LoginContext.getInstance().setState(new LogOutState());
LoginContext.getInstance().forward();
}
}
运行结果:
不能评论,没有登录,跳到登录页面
切换注销状态
评论成功!
转发成功!
切换注销状态
不能转发,没有登录,跳到登录页面