Modo de estado: el cambio de estado del trabajador en un día

  Definición del modo de estado (estado) : cuando el estado interno de un objeto cambia, se le permite cambiar su comportamiento, este objeto parece haber cambiado de clase.

  Qué es el estado:
  algunos objetos en la aplicación pueden comportarse de manera diferente según las diferentes situaciones. Llamamos a este tipo de objeto un objeto con estado y llamamos a una o más propiedades que cambian dinámicamente que afectan el comportamiento del objeto. Estado

  Ventajas :

  • Coloque los comportamientos relacionados con un estado específico en ese estado y separe los comportamientos en diferentes estados, elimine la oración de elección y cumpla con el "principio de responsabilidad única".
  • La introducción de diferentes estados en objetos independientes hará que las transiciones de estado sean más explícitas y reducirá la interdependencia entre objetos.
  • La clase estatal tiene responsabilidades claras, lo que favorece la expansión del programa. Es fácil agregar nuevos estados y transiciones definiendo nuevas subclases.

  Desventajas :

  • Inevitablemente, aumentará el número de clases y objetos en el sistema.
  • La estructura y la implementación son relativamente complicadas y, si se usan incorrectamente, causarán confusión en la estructura y el código del programa.
  • No es propicio para la realización del principio de apertura y cierre. Para el modo de estado que puede cambiar de estado, agregar una nueva clase de estado necesita modificar el código fuente que es responsable de la transición de estado; de lo contrario, no podrá cambiar al nuevo estado, y el comportamiento de modificar una clase de estado necesita ser modificado El código fuente de la clase correspondiente.

  La estructura del patrón.

  • Rol de contexto: también conocido como contexto, define la interfaz requerida por el cliente, mantiene un estado actual internamente y es responsable de cambiar entre estados específicos.
  • Rol de estado abstracto (Estado): define una interfaz para encapsular el comportamiento correspondiente a un estado específico en el objeto de entorno, que puede tener uno o más comportamientos.
  • Rol del estado concreto (Estado concreto): para lograr el comportamiento correspondiente al estado abstracto y para cambiar el estado cuando sea necesario.
    Inserte la descripción de la imagen aquí


  Antecedentes del código : el estado mental de un trabajador a tiempo parcial desde la mañana hasta la noche.

Clase de estado abstracto:

public abstract class State
    {
    
    
        public abstract void WriteProgram(Work w);
    }

Categoría de estado específica:

    //上午工作状态
    public class ForenoonState : State
    {
    
    
        public override void WriteProgram(Work w)
        {
    
    
            if (w.Hour < 12)
            {
    
    
                Console.WriteLine("当前时间:{0}点 上午工作,精神百倍",w.Hour);
            }
            else
            {
    
    
                w.SetState(new NoonState());w.WriteProgram();
            }
        }
    }
    //中午工作状态
    public class NoonState : State
    {
    
    
        public override void WriteProgram(Work w)
        {
    
    
            if (w.Hour < 13)
            {
    
    
                Console.WriteLine("当前时间:{0}点 饿了,想吃饭;犯困,想睡觉。", w.Hour);
            }
            else
            {
    
    
                w.SetState(new AfternoonState()); w.WriteProgram();
            }
        }
    }
    //下午工作状态
    public class AfternoonState : State
    {
    
    
        public override void WriteProgram(Work w)
        {
    
    
            if (w.Hour < 17)
            {
    
    
                Console.WriteLine("当前时间:{0}点 下午状态还不错,继续努力", w.Hour);
            }
            else
            {
    
    
                w.SetState(new EveningState()); w.WriteProgram();
            }
        }
    }
    //晚上工作状态
    public class EveningState : State
    {
    
    
        public override void WriteProgram(Work w)
        {
    
    
            if (w.TaskFinished)
            {
    
    
                w.SetState(new RestState());w.WriteProgram();//完成任务就转成下班状态
            }
            else
            {
    
    
                if (w.Hour <21)
                {
    
    
                    Console.WriteLine("当前时间:{0}点 加班了,加班人累啊", w.Hour);
                }
                else 
                {
    
    
                    w.SetState(new SleepingState()); w.WriteProgram();//超过21点,转入睡眠状态
                }
            }
        }
    }

    //睡眠状态
    public class SleepingState:State
    {
    
    
        public override void WriteProgram(Work w)
        {
    
    
            Console.WriteLine("当前时间:{0}点 不行了,睡着了", w.Hour);
        }
    }
    //下班休息状态
    public class RestState : State
    {
    
    
        public override void WriteProgram(Work w)
        {
    
    
            Console.WriteLine("当前时间:{0}点 不行了,睡着了", w.Hour);
        }
    }

Categoría de trabajo (categoría ambiental):

    public class Work
    {
    
    
        private State current;
        
        public Work()
        {
    
    
            current = new ForenoonState();	//初始化为上午9点开始上班
        }
        private double hour;
        public double Hour	//小时钟,状态转换的依据
        {
    
    
            get {
    
     return hour; }
            set {
    
     hour = value; }
        }
        private bool finish = false;
        public bool TaskFinished	//完成任务属性,是否能下班的依据
        {
    
    
            get {
    
     return finish; }
            set {
    
     finish = value; }
        }
        public void SetState(State s)	//得到状态
        {
    
    
            current = s;
        }
        public void WriteProgram() 
        {
    
    
            current.WriteProgram(this);
        }
    }

Cliente:

        static void Main(string[] args)
        {
    
    
            Work emergencyProjects = new Work();
            emergencyProjects.Hour = 9;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 10;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 12;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 13;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 14;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 17;

            emergencyProjects.TaskFinished = false;//未完成任务,加班

            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 19;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 22;
            emergencyProjects.WriteProgram();

            Console.Read();       
        }

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/CharmaineXia/article/details/111089083
Recomendado
Clasificación