Roadmap › Design Patterns (GoF + Enterprise) in C# › Module: Behavioural Patterns
Lessons in this course (18)

13. Command, Template Method, State and Mediator

IntermediateMediumLesson 13 of 18

Command — wrap a request as an object (queue it, log it, undo it). CQRS commands (PlaceOrderCommand) and background job payloads are commands.

Template Method — the base class defines the algorithm's skeleton; subclasses fill in steps.

csharp
public abstract class DataImporter
{
    public void Run() { var raw = Extract(); var clean = Transform(raw); Load(clean); }   // fixed skeleton
    protected abstract string[] Extract();
    protected virtual string[] Transform(string[] rows) => rows.Where(r => r.Length > 0).ToArray();
    protected abstract void Load(string[] rows);
}

State — an object changes behaviour when its internal state changes (Order: Pending → Paid → Shipped → Delivered, each state class allowing only valid transitions).

Mediator — objects talk through a mediator instead of directly, which reduces coupling. MediatR: controllers send IRequests, handlers process them.

csharp
public record GetOrder(int Id) : IRequest<OrderDto?>;
public class GetOrderHandler(AppDbContext db) : IRequestHandler<GetOrder, OrderDto?>
{
    public Task<OrderDto?> Handle(GetOrder q, CancellationToken ct) =>
        db.Orders.Where(o => o.Id == q.Id).Select(o => new OrderDto(o.Id, o.Total)).FirstOrDefaultAsync(ct);
}
// controller: return await mediator.Send(new GetOrder(id));