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.
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();
}