Array
(
)

Implementando Chain of Responsibility

Jackson Pimentel
   - 07 jun 2010

Olá Pessoal,

Sou novo por aqui, estou começando em POO em C#.

Fiz uma implementação do padrão  Chain of Responsibility, duma forma um pouco diferente, eu tenho uma serie de etapas de validações que um determinado objeto tem que passar, antes de ser inserido no banco de dados, eu tenho uma cadeia de objetos de validação (etapas) padrão, porem dependendo de alguns parametros, podem ser adicionadas etapas a essa cadeia, especificamente para aquele caso, entao  minha intenção com esse codigo é que eu posso criar um objeto de validação e adiciona-lo a o final da fila, apenas informando quem é o objeto de validação anterior. Gostaria da opnião dos colegas.

 

// Classe padrão com o mecanismo da corrente, somente para herança.

    public abstract class ValidadorObjetoCadastro<T>

    {

        public T Objeto { get; set; }

        public ValidadorObjetoCadastro<T> ProximoValidador { get; set; }

        protected ValidadorObjetoCadastro<T> ValidadorAnterior { get; set; }

        public void ChamarProximoValidador()

        {

            ValidarObjeto();

            if (ProximoValidador == null)

                return;

            ProximoValidador.Objeto = this.Objeto;

            ProximoValidador.ChamarProximoValidador();

        }

        public void IniciarValidacao(T objeto)

        {

            if (ValidadorAnterior != null)

            {

                ValidadorAnterior.IniciarValidacao(objeto);

            }

            else

            {

                this.Objeto = objeto;

                ChamarProximoValidador();

            }

        }

        public ValidadorObjetoCadastro(ValidadorObjetoCadastro<T> validadorAnterior)

        {

            ValidadorAnterior = validadorAnterior;

            if (ValidadorAnterior != null )

            {

                ValidadorAnterior.ProximoValidador = this;                

            }

        }

        protected abstract void ValidarObjeto();

    }

 

// ============== Etapadas - Validaçoes ================ 

 

    public class PrimeiroValidador : ValidadorObjetoCadastro<Pessoa>

    {

        public PrimeiroValidador()

            : base(null)

        {

        }

        protected override void ValidarObjeto()

        {

            System.Console.WriteLine("Validações do primeiro objeto");

        }

    }

 

    public class SegundoValidador : ValidadorObjetoCadastro<Pessoa>

    {

        public SegundoValidador()

            : base(new PrimeiroValidador())

        {

        }

        protected override void ValidarObjeto()

        {

            System.Console.WriteLine("Validações do Segundo objeto");

        }

    }

 

    public class TerceiroValidador : ValidadorObjetoCadastro<Pessoa>

    {

        public TerceiroValidador()

            : base(new SegundoValidador())

        {

        }

        protected override void ValidarObjeto()

        {

            System.Console.WriteLine("Validações do Terceiro objeto");

        }

    }



// Chamada
            TerceiroValidador terceiroValidador = new TerceiroValidador();            terceiroValidador.IniciarValidacao(new Pessoa());