[Modo de diseño] - 18, Modo de estado

(18) Modo de estado

El patrón de estado permite que un objeto cambie su estado cuando cambia su estado interno, y el comportamiento de una clase cambia según su estado.

1. Los principios de diseño del patrón de estado.

1. Contexto: define la interfaz requerida por el cliente, mantiene internamente una instancia de estado actual y es responsable del cambio de estado;

2. Estado abstracto (IState): define el comportamiento del estado;

3. Concrear: El comportamiento de un estado concreto.

imagen-20210318142941479

2. Ejemplo sencillo

Cuando leemos artículos en la comunidad, las operaciones como comentarios y colecciones deben realizarse en el estado de inicio de sesión; de lo contrario, saltaremos a la página de inicio de sesión de manera uniforme. A continuación, usaremos el patrón de estado para realizar el escenario anterior.

public abstract class UserState {
    
    
//    状态接口需要维护一个context
    protected AppContext appContext;

    public void setAppContext(AppContext appContext) {
    
    
        this.appContext = appContext;
    }

    public abstract void favorite();
    public abstract void comment(String comment);
}
public class LoginState extends UserState {
    
    
    @Override
    public void favorite() {
    
    
        System.out.println("收藏成功!");
    }

    @Override
    public void comment(String comment) {
    
    
        System.out.println(comment);
    }
}
public class UnLoginState extends UserState {
    
    
//    未登录状态下的行为多了一个切换操作
    @Override
    public void favorite() {
    
    
        this.switch2Login();
        this.appContext.getState().favorite();
    }

    @Override
    public void comment(String comment) {
    
    
        this.switch2Login();
        this.appContext.getState().favorite();
    }
//    切换到登录
    public void switch2Login(){
    
    
        System.out.println("跳转到登录页面!");
        this.appContext.setState(this.appContext.STATE_LOGIN);
    }
}
public class AppContext {
    
    
//    context内部维护两种状态
    public static final UserState STATE_LOGIN = new LoginState();
    public static final UserState STATE_UNLOGIN = new UnLoginState();

    private UserState currentState = STATE_UNLOGIN;

//    代码块初始化状态对应的context
    {
    
    
        STATE_LOGIN.setAppContext(this);
        STATE_UNLOGIN.setAppContext(this);
    }
//   设置状态,同时设置当前状态的context
    public void setState(UserState state){
    
    
        this.currentState = state;
        this.currentState.setAppContext(this);
    }
    public UserState getState(){
    
    
        return this.currentState;
    }
//    内部需要维护当前状态的方法
    public void favorite(){
    
    
        this.currentState.favorite();
    }

    public void comment(String comment){
    
    
        this.currentState.comment(comment);
    }
}
public class Client {
    
    
    public static void main(String[] args) {
    
    
        AppContext appContext = new AppContext();
        appContext.favorite();
        appContext.comment("我赞!");
    }
}
跳转到登录页面!
收藏成功!
我赞!

imagen-20210318145954302

3. Comentarios sobre el modo de estado

El modo de estado cambia el estado a través del contexto, lo que encapsula bien los detalles de la transición. Pero viola el principio abierto-cerrado y debe conocer todos los estados.

Comparado con el modelo de Cadena de Responsabilidad, el estado del Modelo de Estado conoce el siguiente estado, pero el modelo de Cadena de Responsabilidad no lo sabe, está encapsulado en el cliente;

En comparación con el modo de estrategia, el modo de estado está relacionado entre sí y las estrategias son independientes entre sí.

Supongo que te gusta

Origin blog.csdn.net/qq_40589204/article/details/118343231
Recomendado
Clasificación