Patrones de diseño en C# a nivel avanzado: ejemplos de código

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course
```html

Patrones de diseño avanzados en C#: de la teoría a la práctica



Los patrones de diseño (Design Patterns) son soluciones probadas para problemas típicos de arquitectura de software. A nivel inicial, los desarrolladores se familiarizan con Singleton, Factory o Adapter. Sin embargo, para crear sistemas flexibles, mantenibles y escalables en la plataforma .NET, es necesario dominar patrones de comportamiento y estructurales más complejos. En este artículo analizaremos tres patrones avanzados: Chain of Responsibility, State y Visitor. Cada patrón se ilustrará con un ejemplo práctico en C# utilizando las capacidades modernas del lenguaje (records, pattern matching, generics).



1. Chain of Responsibility (Cadena de responsabilidad)



El patrón Chain of Responsibility permite pasar una solicitud secuencialmente a través de una cadena de manejadores, hasta que uno de ellos procese la solicitud. Esto elimina el acoplamiento rígido entre el emisor y el receptor. En C#, se utiliza a menudo para middleware en ASP.NET Core o para validación de datos.



Ejemplo: sistema de verificación de permisos de acceso

Supongamos que tenemos una solicitud para ejecutar una operación. Cada manejador verifica una condición (autenticación, autorización, límites).



// Clase base del manejadorpublic abstract class Handler{    protected Handler? NextHandler;

public void SetNext(Handler handler) => NextHandler = handler;

public abstract void Handle(RequestContext context);}

public class AuthenticationHandler : Handler{ public override void Handle(RequestContext context) { if (context.IsAuthenticated) { Console.WriteLine("Autenticación exitosa."); NextHandler?.Handle(context); } else { Console.WriteLine("Error: usuario no autenticado."); } }}

public class AuthorizationHandler : Handler{ public override void Handle(RequestContext context) { if (context.Role == "Admin") { Console.WriteLine("Autorización exitosa."); NextHandler?.Handle(context); } else { Console.WriteLine("Error: permisos insuficientes."); } }}

// Contexto de la solicitudpublic record RequestContext(bool IsAuthenticated, string Role);

// Usovar authHandler = new AuthenticationHandler();var authzHandler = new AuthorizationHandler();authHandler.SetNext(authzHandler);

var context = new RequestContext(true, "Admin");authHandler.Handle(context);// Salida:// Autenticación exitosa.// Autorización exitosa.


Este patrón es ideal para crear pipelines de procesamiento, donde cada paso puede interrumpir la ejecución o pasar el control al siguiente.



2. State (Estado)



El patrón State permite que un objeto cambie su comportamiento cuando cambia su estado interno. Externamente, parece que el objeto cambia su clase. En C#, es conveniente implementarlo mediante interfaces y composición.



Ejemplo: gestión de pedidos en una tienda online

Un pedido puede estar en los estados: Nuevo, Pagado, Enviado, Entregado. Cada estado define qué acciones son permitidas.



// Interfaz de estadopublic interface IOrderState{    void Pay(Order order);    void Ship(Order order);    void Deliver(Order order);}

// Estados concretospublic class NewOrderState : IOrderState{ public void Pay(Order order) { Console.WriteLine("Pedido pagado."); order.State = new PaidOrderState(); }

public void Ship(Order order) => Console.WriteLine("Error: el pedido aún no está pagado."); public void Deliver(Order order) => Console.WriteLine("Error: el pedido aún no ha sido enviado.");}

public class PaidOrderState : IOrde ```

Blogs

Book Recommendations