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));