Antes de começarmos, segue algumas pergunta/respostas:
- O que é padrão de projeto?
R: http://pt.wikipedia.org/wiki/Padr%C3%A3o_de_projeto_de_software - O que é State pattern (estado)?
- Explicação sobre o padrão State:
R: http://pt.wikipedia.org/wiki/State
R: http://en.wikipedia.org/wiki/State_pattern - Qual sua categoria?
R: Comportamental
- Sua estrutura padrão:
- Explicação sobre o padrão State:
- O que é um semáforo?
Bom, explicações dadas, agora vamos começar a brincar com nossopadrão. O exemplo usado foi de um semafóro de trânsito.
Com base na estrutura básica do padrão de estado, criei as seguintes classes:
public enum Sinal { VERMELHO, AMARELO, VERDE };
//Estado
public abstract class Status
{
public abstract Sinal Sinal { get; }
public abstract ConsoleColor Cor { get; }
public abstract void ProximoStatus(Semaforo semaforo);
}
//Estados concretos.
public class Verde : Status
{
public override ConsoleColor Cor { get { return ConsoleColor.Green; } }
public override Sinal Sinal { get { return Sinal.VERDE; } }
public override void ProximoStatus(Semaforo semaforo)
{
semaforo.Status = new Amarelo();
}
}
public class Verde : Status
{
public override ConsoleColor Cor { get { return ConsoleColor.Green; } }
public override Sinal Sinal { get { return Sinal.VERDE; } }
public override void ProximoStatus(Semaforo semaforo)
{
semaforo.Status = new Amarelo();
}
}
public class Vermelho : Status
{
public override ConsoleColor Cor { get { return ConsoleColor.Red; } }
public override Sinal Sinal { get { return Sinal.VERMELHO; } }
public override void ProximoStatus(Semaforo semaforo)
{
semaforo.Status = new Verde();
}
}
//Contexto
public class Semaforo
{
private Status status;
private ConsoleColor Vermelho = ConsoleColor.DarkRed;
private ConsoleColor Amarelo = ConsoleColor.DarkYellow;
private ConsoleColor Verde = ConsoleColor.DarkGreen;
public Semaforo(Status status)
{
this.status = status;
this.Desenhar();
}
public Status Status
{
get { return status; }
set
{
status = value;
Vermelho = ConsoleColor.DarkRed;
Amarelo = ConsoleColor.DarkYellow;
Verde = ConsoleColor.DarkGreen;
switch (status.Sinal)
{
case Sinal.VERDE:
Verde = ConsoleColor.Green;
break;
case Sinal.AMARELO:
Amarelo = ConsoleColor.Yellow;
break;
case Sinal.VERMELHO:
Vermelho = ConsoleColor.Red;
break;
}
this.AlterarSemaforo();
}
}
public void AlterarSinal()
{
status.ProximoStatus(this);
}
private void AlterarSemaforo()
{
//código que aleterá as cores do semáforo.
}
private void Desenhar()
{
//código que desenhará o semáforo no console.
}
}
O Diagrama dessa implementação ficará assim:
Sua chamada ficará assim:
E o resultado final no console será :
Fonte : http://www.xmasters.com.br/francke/StatePattern.zip
public enum Sinal { VERMELHO, AMARELO, VERDE };