Patrones de diseño Notas del patrón de estado

ilustrar

Registre el método de escritura para aprender el patrón de diseño-patrón de estado. La versión de JDK utilizada es la versión 1.8.

Estado(estado)

Intención : permitir que un objeto cambie su comportamiento cuando cambia su estado interno.
Estructura :
Insertar descripción de la imagen aquí

en:

  • El contexto define la interfaz que le interesa al cliente; mantiene una instancia de la subclase ConcreteState, que define el estado actual.
  • El estado define una interfaz para encapsular el comportamiento relacionado con un estado específico del contexto.
  • ConcreteState (subclase de estado concreto) Cada subclase implementa un comportamiento relacionado con un estado de contexto.

aplicabilidad:

  • El comportamiento de un objeto está determinado por su estado y debe cambiar su comportamiento según el estado en tiempo de ejecución.
  • Una operación contiene una gran cantidad de declaraciones condicionales con múltiples ramas, y estas ramas dependen del estado del objeto.

Tabla de contenido

Insertar descripción de la imagen aquí

Diagrama de clases de ejemplo de patrón de estado

[Ejemplo] Utilice botones para controlar el estado de un ascensor. Un ascensor tiene un estado de apertura de puerta, un estado de cierre, un estado detenido y un estado de funcionamiento. Es posible que cada cambio de estado deba actualizarse en función de otros estados. Por ejemplo, si la puerta del ascensor está actualmente en estado de funcionamiento, no se puede realizar la operación de apertura de la puerta, pero si la puerta del ascensor está en un estado detenido, se puede realizar la operación de apertura de la puerta.
Insertar descripción de la imagen aquí

Implemente el ejemplo del patrón de estado con este diagrama de clases UML.

clase de estado abstracto

package com.example.deesign_patterns.state;

//抽象状态类
public abstract class LiftState {
    
    

    //定义一个环境角色,也就是封装状态的变化引起的功能变化
    //声明环境角色类变量
    protected Context context;

    public void setContext(Context context) {
    
    
        this.context = context;
    }

    //电梯开启操作
    public abstract void open();

    //电梯关闭操作
    public abstract void close();

    //电梯运行操作
    public abstract void run();

    //电梯停止操作
    public abstract void stop();
}

Clase de rol ambiental

package com.example.deesign_patterns.state;

//环境角色类
public class Context {
    
    

    //定义对应状态对象的常量
    public final static OpeningState OPENING_STATE=new OpeningState();
    public final static ClosingState CLOSING_STATE=new ClosingState();
    public final static RunningState RUNNING_STATE=new RunningState();
    public final static StoppingState STOPPING_STATE=new StoppingState();

    //定义一个当前电梯状态变量
    private LiftState liftState;

    public LiftState getLiftState() {
    
    
        return liftState;
    }

    //设置当前状态对象
    public void setLiftState(LiftState liftState) {
    
    
        this.liftState = liftState;
        //设置当前状态对象中的Context对象
        this.liftState.setContext(this);
    }

    public void open(){
    
    
        this.liftState.open();
    }

    public void close(){
    
    
        this.liftState.close();
    }

    public void run(){
    
    
        this.liftState.run();
    }

    public void stop(){
    
    
        this.liftState.stop();
    }
}

Clase de estado de apertura de ascensor

package com.example.deesign_patterns.state;

//电梯开启状态类
public class OpeningState extends LiftState{
    
    

    //当前状态要执行的方法
    @Override
    public void open() {
    
    
        System.out.println("电梯开启。。。");
    }

    @Override
    public void close() {
    
    
        //修改状态
        super.context.setLiftState(Context.CLOSING_STATE);
        //调用当前状态中的context中的close方法
        super.context.close();
    }

    @Override
    public void run() {
    
    
        //因为要开启,还没到运行所以什么都不做
    }

    @Override
    public void stop() {
    
    
        //因为要开启,还没到停止所以什么都不做
    }
}

Clase de estado de ascensor cerrado

package com.example.deesign_patterns.state;

//电梯关闭状态类
public class ClosingState extends LiftState{
    
    

    //电梯门关闭再打开,很合理
    @Override
    public void open() {
    
    
        //修改状态
        super.context.setLiftState(Context.OPENING_STATE);
        //调用当前状态中的context中的open方法
        super.context.open();
    }

    //当前状态要执行的方法
    @Override
    public void close() {
    
    
        System.out.println("电梯门关闭。。。");
    }

    //电梯门关了再运行,很合理
    @Override
    public void run() {
    
    
        //修改状态
        super.context.setLiftState(Context.RUNNING_STATE);
        //调用当前状态中的context中的run方法
        super.context.run();
    }

    //电梯门关着,我就不按楼层
    @Override
    public void stop() {
    
    
        //修改状态
        super.context.setLiftState(Context.STOPPING_STATE);
        //调用当前状态中的context中的stop方法
        super.context.stop();
    }
}

Clase de estado de funcionamiento del ascensor

package com.example.deesign_patterns.state;

//电梯运行状态类
public class RunningState extends LiftState{
    
    

    //运行的时候开电梯门,是不允许的,所以什么都不做
    @Override
    public void open() {
    
    

    }

    //运行状态电梯门肯定是关闭的,所以什么也不做
    @Override
    public void close() {
    
    

    }

    //当前状态要执行的方法
    @Override
    public void run() {
    
    
        System.out.println("电梯正在运行。。。");
    }

    //既能运行,必然要停止
    @Override
    public void stop() {
    
    
        //修改状态
        super.context.setLiftState(Context.STOPPING_STATE);
        //调用当前状态中的context中的stop方法
        super.context.stop();
    }
}

Clase de estado de parada de ascensor

package com.example.deesign_patterns.state;

//电梯停止状态类
public class StoppingState extends LiftState{
    
    

    //电梯停止再开门,很合理
    @Override
    public void open() {
    
    
        //修改状态
        super.context.setLiftState(Context.OPENING_STATE);
        //动作委托为CloseState来执行,也就是委托给ClosingState子类执行这个歌动作
        super.context.getLiftState().open();
    }

    //虽然可以关闭,但这个状态不归我管
    @Override
    public void close() {
    
    
        //修改状态
        super.context.setLiftState(Context.CLOSING_STATE);
        //动作委托为CloseState来执行,也就是委托给ClosingState子类执行这个歌动作
        super.context.getLiftState().close();
    }

    //电梯停止再运行起来,很合理
    @Override
    public void run() {
    
    
        //修改状态
        super.context.setLiftState(Context.RUNNING_STATE);
        //动作委托为CloseState来执行,也就是委托给ClosingState子类执行这个歌动作
        super.context.getLiftState().run();
    }

    //当前状态要执行的方法
    @Override
    public void stop() {
    
    
        System.out.println("电梯停止了。。。");
    }
}

clase de prueba

package com.example.deesign_patterns.state;

//测试类
public class Client {
    
    

    public static void main(String[] args) {
    
    
        //创建环境角色对象
        Context context=new Context();
        //设置当前电梯状态,这里设置为正在运行状态
        context.setLiftState(new RunningState());
        context.open();
        context.close();
        context.run();
        context.stop();
    }
}


Insertar descripción de la imagen aquí

beneficio:

  • Coloque todos los comportamientos relacionados con un determinado estado en una clase y podrá agregar nuevos estados fácilmente. Solo necesita cambiar el estado del objeto para cambiar el comportamiento del objeto.
  • Permite integrar la lógica de transición de estado con el objeto de estado en lugar de un enorme bloque de declaración condicional.

defecto:

  • El uso del modo de estado inevitablemente aumentará la cantidad de clases y objetos del sistema.
  • La estructura y la implementación del patrón de estado son relativamente complejas y, si se usan incorrectamente, generarán confusión en la estructura y el código del programa.
  • El patrón estatal no apoya muy bien el principio abierto-cerrado.

Supongo que te gusta

Origin blog.csdn.net/weixin_48040732/article/details/131361698
Recomendado
Clasificación